2016-09-14 97 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

避免此类错误的最佳方法是不要将字符串用作定时器函数的参数。