繁体   English   中英

Javascript:连续打开windows问题

[英]Javascript: Opening windows in a row problem

这是我的 html:

<!DOCTYPE html>
 <html lang="en">
 <head>
   <meta charset="utf-8">
   <title>Something</title>
 </head>
 <body>
   <a href="http://www.google.com">Try Me!</a>
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
   <script>
$("a").click(function(event){
  for(id=0;id<=10;id++){
    setTimeout(function() {
      var local_id = id;
      window.open("http://www.mysite.com/characterID="+local_id,"", "win"+local_id, "width=100,height=100,resizable");
      }, 3000*id);
   }
   event.preventDefault();
});

   </script>
 </body>
 </html>

此链接在下一个 3 秒后打开每个 window。

这是我需要的行: http://www.mysite.com/characterID=1, http://www.mysite.com/characterID=2 , http://www.mysite.com/characterID=3 ...

但它总是打开http://www.mysite.com/characterID=11

我该如何解决?

谢谢...

这是一个常见的问题。

您在循环中覆盖local_id ,并且在代码运行时始终引用相同的变量。 这是因为 JavaScript没有块 scope ,只是 function Z31A1FD140BE4BEF2D11E8A51

因此对于 scope 的id ,您需要调用 function,并在那里定义变量(或 function 参数)。

function createWindow(local_id) {
    setTimeout(function () {
        window.open("http://www.mysite.com/characterID=" + local_id, "", "win" + local_id, "width=100,height=100,resizable");
    }, 3000 * local_id);
}

for (id = 0; id <= 10; id++) {
    createWindow(id);
}

或者类似的模式是让 function 返回一个 function 到循环。

function createWindow(local_id) {
    return function() {
        window.open("http://www.mysite.com/characterID=" + local_id, "", "win" + local_id, "width=100,height=100,resizable");
    };
}

for (id = 0; id <= 10; id++) {
    setTimeout( createWindow(id) , 3000 * id);
}

这是因为var local_id = id; 当 id 设置为 11 时,在循环退出后调用。

尝试这个:

for(id=0;id<=10;id++){
   setTimeout('window.open("http://www.mysite.com/characterID='+id+'","win'+id+'","width=100,height=100,resizable")', 3000*id);
}

多年后,我想回答我自己的问题。 我不记得我在做什么,但我的解决方案应该使用let not var let是 scope 有界而 var 不是。

for(id=0;id<=10;id++){
    let local_id = id;    
    setTimeout(function() {
          console.log(local_id)
    }, 3000);
}

这是一个经典的 JavaScript 关闭问题。 匿名 function 使用在循环结束时设置为 11 的值id 要解决此问题,您需要创建一个 function 来返回一个 function (它将在id值附近关闭)。

像这样尝试:

$("a").click(function(event) {
    var timeout = function(local_id){
        return function(){
            window.open("http://www.mysite.com/characterID=" + local_id, "", "win" + local_id, "width=100,height=100,resizable");
        };
    };
    for (id = 0; id <= 10; id++) {
        setTimeout(timeout(id), 3000 * id);
    }
    event.preventDefault();
});

您可以将 id 作为附加参数传递给 setTimeout,如下所示:(这本质上是@mrk 的答案,邪恶较少。)

setTimeout(function(local_id) {
  window.open("http://www.mysite.com/characterID="+local_id,"", "win"+local_id, "width=100,height=100,resizable");
  }, 3000*id, id);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM