【问题标题】:JavaScript For Loop executes for last value of iterator onlyJavaScript For Loop 仅针对迭代器的最后一个值执行
【发布时间】:2014-09-09 21:50:47
【问题描述】:

我正在尝试从某个网站下载文件,例如“website.com”。我在 array 中拥有所有唯一 ID。

这是我写的代码:

for(var i=0;i<ids.length;i++) {
    var timeInterval = 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
        timeInterval = (i+1)*1000;
    })(i,timeInterval);
}

问题在于它会下载与数组 ids 的最后一个元素相对应的文件,而不是全部。
如何使循环对 ids 中的每个元素都有效?
PS:我已经尝试了不同相关问题中给出的各种解决方案,但没有一个能带来预期的结果,所以我不得不将它作为一个不同的问题发布。

【问题讨论】:

  • 您正在模拟点击链接。单击链接会重新加载页面并停止脚本运行。
  • 我很惊讶浏览器允许您像这样启动下载。我认为这是被禁止的,因为网站可以使用它来触发数百次下载。
  • @Barmar:chrome 让您在第二次或第三次下载后确认您想要更多文件。

标签: javascript arrays closures


【解决方案1】:

您在匿名函数的末尾更新“timeInterval”参数,虽然该语句没有任何问题,但它没有任何好处——它更新了“timeInterval”参数 ,而不是循环外的“timeInterval”变量。您可以这样做作为一种选择:

for(var i=0;i<ids.length;i++) {
    var timeInterval = (i + 1) * 1000;
    (function(i,timeInterval){
        setTimeout(function(){
            var link = document.createElement('a');
            link.href= "http://website.com/download/"+ids[i];
            var e = document.createEvent('MouseEvents');
            e.initEvent('click', true, true);
            link.dispatchEvent(e);
            console.log(ids[i]);
            console.log(timeInterval);
        }, timeInterval);
    })(i,timeInterval);
}

只在匿名函数之外进行计算。

edit — 请注意,您可能仍会遇到问题,具体取决于此代码运行的上下文。浏览器可能不喜欢这种行为。

【讨论】:

  • 我认为他仍然会遇到我在评论中提到的问题。唯一的区别是它将加载第一个链接而不是最后一个。
  • @Barmar 如果这些链接是返回附件的东西(例如,要下载的文件),那么它会起作用。
  • 如果链接下载文件,它不会重新加载页面,是吗?
  • 但是,为什么不能这样下载呢?我没明白。有什么我可以做的吗?
  • OP 还可以调整传递给 setTimeout 的时间间隔:...}, timeInterval * i);.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多