打开新页面

时间:2013-10-23 16:02:26

标签: javascript

我已经尝试了几十种不同的解决方案来解决这个问题。基本上我已经构建了一个包含大量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行抛出“无效参数”错误。我似乎无法弄清楚为什么会这样。我尝试过的每一次迭代都要么打开一个窗口(数组中的第一个)并停止,要么完全打开所有内容而忽略超时。我觉得这个实际上可能有用,因为它实际上做了不同的事情。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

当作为参数传递时,您正在评估go(i)。该函数在循环中执行。相反,您应该返回一个函数对象,并在计时器触发时执行。

不要做function(){go(i);},这是一个经典的关闭错误。每次事件触发时,您最终都会调用函数go(i),但最终值为ii的范围是封闭函数,因此在超时运行时它的值为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的工作方式。

  1. 它会立即执行值为i的函数。
  2. 返回一个函数对象,但该函数位于一个闭包中,其中i的值绑定在该时间点。
  3. 当超时事件触发时,将执行函数对象,其值i正确绑定。

答案 1 :(得分:0)

window.setTimeout(function(){ go(i); }, 60000*i;);

你走了!