我已经尝试了似乎数十种不同的解决方案,但都出现了不同的失败。基本上我已经构建了一个数组,其中包含一堆 ID,我使用 javascript 循环遍历它们并打开经历存档过程的页面。这些需要延迟,因为每个事件发生大约需要一分钟。这是我目前拥有的:
var i = 0
function openPage() {
while (i < Array.length) {
window.setTimeout(go(i), 60000*i;);
i++;
}
}
function go(i) {
window.open('http://localhost:12575/DD7RO2.aspx?id=' + Array[i][0]);
}
然后我通过按下按钮来调用 openPage。
由于某种原因,这会在 window.setTimeout 行引发“无效参数”错误。我似乎不明白为什么会这样。我尝试过的所有其他迭代要么打开一个窗口(数组中的第一个窗口)并停止,要么打开所有内容完全忽略超时。我觉得这个可能真的有效,因为它实际上在做一些不同的事情。任何帮助将不胜感激。
最佳答案
当 go(i)
作为参数传递时,您正在对其进行评估。该函数在循环中执行。相反,您应该返回一个函数对象,该对象将在计时器触发时执行。
不要执行function(){go(i);}
,这是一个典型的闭包错误。每次事件触发时,您最终都会调用函数go(i)
,但最终的i
值相同。 i
的范围是封闭函数,因此当超时运行时,它将具有 Array.length - 1
的值。
而是类似
window.setTimeout((function (j){return function(j){go(j)}})(i), 60000*i;);
将其拼写出来;
(
function (j) {
var k = j;
return function() {
go(k)
}
}
)(i);
这看起来很困惑,但这就是 JS 的工作方式。
- 它立即执行一个值为
i
的函数。 - 它返回一个函数对象,但该函数位于一个闭包中,其中
i
的值在该时间点绑定(bind)。 - 超时事件触发时执行函数对象,并正确绑定(bind)
i
的值。
关于javascript - 打开新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546726/