2016-09-14 5 views
0

Das ist mein Skript:Reference definiert nicht

<script> 
    document.addEventListener("DOMContentLoaded", function(event) { 
    var START_DATE_1 = new Date("July 18, 2016 10:30:00"); // put in the starting date here 
    var INTERVAL_1 = 3; // in seconds 
    var INCREMENT_1 = 1; // increase per tick 
    var START_VALUE_1 = 0; // initial value when it's the start date 
    var count_1 = 0; 

    var msInterval_1 = INTERVAL_1 * 1000; 
    var now_1 = new Date(); 
    count_1 = parseInt((now_1 - START_DATE_1)/msInterval_1) * INCREMENT_1 + START_VALUE_1; 
    document.getElementById('counter_1').innerHTML = count_1; 
    setInterval("count_1 += INCREMENT_1; document.getElementById('counter_1').innerHTML = count_1;", msInterval_1); 
    }); 
</script> 

ich es in einem Joomla Modul platziert haben. Firebug sagt: "ReferenceError: count_1 ist nicht definiert"

Warum? Wie kann ich es lösen?

Antwort

3

Sie sollten eine Funktion anstelle einer Zeichenfolge an den setInterval Aufruf übergeben. Wenn Sie eine Zeichenfolge übergeben, wird sie im globalen Gültigkeitsbereich ausgeführt, und die Variable count_1 ist nur im Rahmen der Rückruffunktion vorhanden, die an addEventListener übergeben wird.

<script> 
    document.addEventListener("DOMContentLoaded", function(event) { 
    var START_DATE_1 = new Date("July 18, 2016 10:30:00"); // put in the starting date here 
    var INTERVAL_1 = 3; // in seconds 
    var INCREMENT_1 = 1; // increase per tick 
    var START_VALUE_1 = 0; // initial value when it's the start date 
    var count_1 = 0; 

    var msInterval_1 = INTERVAL_1 * 1000; 
    var now_1 = new Date(); 
    count_1 = parseInt((now_1 - START_DATE_1)/msInterval_1) * INCREMENT_1 + START_VALUE_1; 
    document.getElementById('counter_1').innerHTML = count_1; 
    setInterval(function() { 
     count_1 += INCREMENT_1; 
     document.getElementById('counter_1').innerHTML = count_1; 
    }, msInterval_1); 
    }); 
</script> 
+0

Danke Gothdo, das hat funktioniert! Würdest du mir bitte auch helfen, die Zahlen des Zählers mit Tausendertrennzeichen zu rendern (Beispiel 3.234.000)? – Francesco

+1

@Francesco Sie sollten das als eine neue Frage stellen. Kommentare sind nicht für längere Diskussionen. –

0

Wenn Sie in einer Zeichenfolge als erstes Argument an die Timer-Funktion übergeben, schaffen sie tatsächlich ein Skriptobjekt mit, dass als Quelle:

[Otherwise]

Perform HostEnsureCanCompileStrings(callerRealm, calleeRealm). If this throws an exception, report the exception.

Let script source be the first method argument.

Let settings object be method context's environment settings object.

Let script be the result of creating a classic script using script source and settings object.

Run the classic script script.

https://html.spec.whatwg.org/multipage/webappapis.html#dom-setinterval

Also, es ist nicht genau als eval, wo Sie tatsächlich Zugriff auf den Umfang der Funktion erhalten. Das Skriptobjekt sollte Zugriff auf den globalen Bereich haben. Der Grund, warum es fehlschlägt, ist, weil es count_1 auf dem globalen Gültigkeitsbereich durch count_1 += INCREMENT sucht, die nicht gefunden wird und daher die ReferenceError zurückgibt.

Der beste Weg, um diese Art von Fehlern zu vermeiden, ist die Verwendung einer Zeichenfolge als Argument für die Timer-Funktion.

Verwandte Themen