javascript - 打开新页面

标签 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 行引发“无效参数”错误。我似乎不明白为什么会这样。我尝试过的所有其他迭代要么打开一个窗口(数组中的第一个窗口)并停止,要么打开所有内容完全忽略超时。我觉得这个可能真的有效,因为它实际上在做一些不同的事情。任何帮助将不胜感激。

最佳答案

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 的工作方式。

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

关于javascript - 打开新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19546726/

相关文章:

javascript - Angular 5 中基于 HTTP 响应有条件地延迟加载模块

javascript - 如何防止 AngularJS 递归绑定(bind)?

javascript - 禁用按钮,直到表单填满特定长度

javascript - 如何在alert中打印数组数据

javascript - 从 Angular Controller 访问输入字段会导致未定义

javascript - 是否可以在 IE8+ 的浏览器窗口中打开 .js 文件(像 Firefox 一样)

javascript - 是否可以在脚本中的 php echo 中显示和隐藏按钮?

javascript - 如何获得按对象键过滤的唯一对象数组?

javascript - 是否可以使用前端 JavaScript 编写 JSON 文件?

javascript - Phaser 不渲染组中创建的对象