2016-09-14 98 views
0

這是我的腳本:的ReferenceError沒有定義

<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> 

我把它放在一個Joomla模塊內部。 Firebug說:「ReferenceError:count_1未定義」

爲什麼?我該如何解決它?

回答

3

您應該將函數而不是字符串傳遞給setInterval調用。當你傳遞一個字符串時,它會在全局範圍內執行,並且count_1變量只存在於傳遞給addEventListener的回調函數的作用域中。

<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

謝謝Gothdo,工作!你是否還請幫助我使用千位分隔符來呈現櫃檯的數字(例如3.234.000)? – Francesco

+1

@Francesco你應該問這是一個新的問題。評論不適合擴展討論。 –

0

當您在一個字符串作爲第一個參數定時器功能通過,他們實際上與作爲源創建一個腳本對象:

[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

所以,它不完全作爲eval,您實際上可以訪問該函數的範圍。腳本對象應該可以訪問全局範圍。它失敗的原因是因爲它在全球範圍內查找count_1,通過count_1 += INCREMENT找不到,因此返回ReferenceError

避免此類錯誤的最佳方法是不要將字符串用作定時器函數的參數。