这是我的剧本:
<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说:&#34; ReferenceError:count_1未定义&#34;
为什么呢?我该如何解决?
答案 0 :(得分: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>
答案 1 :(得分:0)
当你传入一个字符串作为定时器函数的第一个参数时,它们实际上创建了一个脚本对象,并将其作为源:
<强> [否则] 强>
执行HostEnsureCanCompileStrings(callerRealm,calleeRealm)。如果这会抛出异常,则报告异常。
让脚本源成为第一个方法参数。
让设置对象成为方法上下文的环境设置对象。
让脚本成为使用脚本源和设置对象创建经典脚本的结果。
运行经典脚本脚本。
https://html.spec.whatwg.org/multipage/webappapis.html#dom-setinterval
因此,它与您实际访问函数范围的eval
不完全相同。脚本对象应该可以访问全局范围。它失败的原因是因为它通过count_1
查找全局范围内的count_1 += INCREMENT
,但找不到ReferenceError
。
避免此类错误的最佳方法是不使用字符串作为计时器函数的参数。