Forum: PC-Programmierung [JAVA Script] Wird nur bei Neu Laden ausgeführt.


von Rene K. (xdraconix)


Angehängte Dateien:

Lesenswert?

Ich habe da ein Problem. Ich habe ein Javascript welches mir ein 
Bargraph zeichnet. Nun ist aber das Problem das es ausschließlich nur 
dann auseführt wird wenn die Seite neu geladen wird. Wenn ich das Script 
bzw. die dazugehörige Seite über das Menü aufrufe, dann wird dies nicht 
geladen.


Das JS script zum Bargraph:
1
<div id="container"></div>
2
<script src="scripts/progressbar.js"></script>
3
<script>
4
var bar = new ProgressBar.SemiCircle(container, 
5
    {
6
        strokeWidth: 6,
7
        color: '#FFEA82',
8
        trailColor: '#eee',
9
        trailWidth: 1,
10
        easing: 'easeInOut',
11
        duration: 1400,
12
        svgStyle: null,
13
        text: 
14
        {
15
            value: '',
16
            alignToBottom: false
17
        },
18
        from: {color: '#FFEA82'},
19
        to: {color: '#ED6A5A'},
20
        // Set default step function for all animate calls
21
        step: (state, bar) => 
22
        {
23
            bar.path.setAttribute('stroke', state.color);
24
            var value = Math.round(bar.value() * 100);
25
            if (value === 0) 
26
            {
27
                bar.setText('');
28
            } else {
29
                bar.setText(value);
30
            }
31
32
        bar.text.style.color = state.color;
33
        }
34
    });
35
    
36
bar.text.style.fontFamily = '"Raleway", Helvetica, sans-serif';
37
bar.text.style.fontSize = '2rem';
38
39
bar.animate(1);  // Number from 0.0 to 1.0
40
</script>



Wenn ich nun dieses Script direkt beim Seitenlade aufrufe geht es (siehe 
Bild) wenn ich nun bei Start eine andere Seite habe (Startseite) und 
dann links über das Menü (Round Bar) gehe, funktioniert dies nicht.

Nun wird aber die Seite über ein Query String nachgeladen in dem 
Navigationsbereich:


1
function load_home(siteLink) 
2
{
3
    fetch(siteLink /*, options */)
4
    .then((response) => response.text())
5
    .then((html) => {
6
        document.getElementById("content").innerHTML = html;
7
    })
8
    .catch((error) => {
9
        console.warn(error);
10
    });
11
}



Kann dies damit zusammenhängen?

: Bearbeitet durch User
von maler und landstreicher (Gast)


Lesenswert?

Rene K. schrieb:
> Kann dies damit zusammenhängen?

ja.
denk mal drüber nach was da in welcher zeitlichen abfolge passiert.

tipp: du wirst eine callback funktion brauchen.

von Rene K. (xdraconix)


Lesenswert?

Ich habe nun doch einen kompletten Seitenrefresh gemacht. Fällt da nicht 
so in das Gewicht.

Danke dennoch für die Antwort :-)

von maler und landstreicher (Gast)


Lesenswert?

Rene K. schrieb:
> Ich habe nun doch einen kompletten Seitenrefresh gemacht.

genau das ist der springende punkt. die funktion zum zeichnen des 
bargraphen wird nur einmal bei pageload aufgerufen. die dom-manipulation 
führt die kein zweites mal aus

von Daniel A. (daniel-a)


Lesenswert?

Das Problem ist ein ganz anderes.
1
document.body.innerHTML = '<script>alert("test");</script>';
Aus Schutz vor XSS wird bei sowas des script tag hier nicht ausgeführt.
Dann musst du die scripts halt selbst Rausfiltern & durch eval jagen, 
wenn du das wirklich so machen willst.

Siehe dir auch mal document.createDocumentFragment und WebComponents an.

: Bearbeitet durch User
von Rene K. (xdraconix)


Angehängte Dateien:

Lesenswert?

maler und landstreicher schrieb:
> genau das ist der springende punkt. die funktion zum zeichnen des
> bargraphen wird nur einmal bei pageload aufgerufen. die dom-manipulation
> führt die kein zweites mal aus

Der Befehl zum Zeichen (onload='function..') läge aber in einem div das 
nachgeladen wurde. Aaaaaaber...

Daniel A. schrieb:
> Aus Schutz vor XSS wird bei sowas des script tag hier nicht ausgeführt.

.... Da macht das alles wieder Sinn. Ich verstehe auch den Sinn dahinter 
dir Scriptausführung danach / dabei zu verhindern. Logisch gesehen ist 
dies für Injections ein großes Scheunentor.

Daniel A. schrieb:
> Dann musst du die scripts halt selbst Rausfiltern & durch eval jagen,
> wenn du das wirklich so machen willst.
>
> Siehe dir auch mal document.createDocumentFragment und WebComponents an.

Nein in diesem Fall mach ich es "altmodisch" und lade die gesamte neu. 
Mich persönlich stört das überhaupt nicht, da sich eh fast alles auf der 
Hauptseite abspielt und ausschließlich für meinen privaten Gebrauch 
gedacht ist.

Dennoch werde ich mir das mal anschauen. Man lernt ja nie aus ☺️

Die Bargraphen (siehe Bild) laufen nun auch absolut sauber, über Ajax 
gefüttert, durch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.