Javascript:连续打开窗口问题

Javascript:连续打开窗口问题,javascript,firefox,Javascript,Firefox,这是我的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="h

这是我的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>

某物
$(“a”)。单击(函数(事件){

对于(id=0;id这是一个典型的JavaScript闭包问题。匿名函数使用的值
id
,在循环结束时设置为11。要解决此问题,您需要创建一个返回函数的函数(该函数将围绕
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();
});
$(“a”)。单击(函数(事件){
变量超时=函数(本地\u id){
返回函数(){
窗口打开(“http://www.mysite.com/characterID=“+local_id,”,“win”+local_id,“宽度=100,高度=100,可调整大小”);
};
};

对于(id=0;id这是一个典型的JavaScript闭包问题。匿名函数使用的值
id
,在循环结束时设置为11。要解决此问题,您需要创建一个返回函数的函数(该函数将围绕
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();
});
$(“a”)。单击(函数(事件){
变量超时=函数(本地\u id){
返回函数(){
窗口打开(“http://www.mysite.com/characterID=“+local_id,”,“win”+local_id,“宽度=100,高度=100,可调整大小”);
};
};

对于(id=0;id而言,这是一个常见问题

您正在覆盖循环中的
local\u id
,并且在代码运行时总是引用相同的变量。这是因为JavaScript没有块作用域,只有函数作用域

因此,要定义
id
,需要调用函数,并在其中定义变量(或函数参数)

函数createWindow(本地\u id){
setTimeout(函数(){
窗口打开(“http://www.mysite.com/characterID=“+local_id,”,“win”+local_id,“宽度=100,高度=100,可调整大小”);
},3000*本地标识);
}

对于(id=0;id而言,这是一个常见问题

您正在覆盖循环中的
local\u id
,并且在代码运行时总是引用相同的变量。这是因为JavaScript没有块作用域,只有函数作用域

因此,要定义
id
,需要调用函数,并在其中定义变量(或函数参数)

函数createWindow(本地\u id){
setTimeout(函数(){
窗口打开(“http://www.mysite.com/characterID=“+local_id,”,“win”+local_id,“宽度=100,高度=100,可调整大小”);
},3000*本地标识);
}

对于(id=0;id这是因为当id设置为11时,在循环退出后调用了
var local_id=id;

试试这个:

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

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

试试这个:

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

for(id=0;id您可以将id作为附加参数传递给setTimeout,如下所示:(这本质上是@mrk的答案,没有那么邪恶。)


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


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

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

for(id=0;id多年后,我想回答我自己的问题。我记不起我想做什么,但我的解决方案应该使用
let
not
var
let
是范围有界的,而var不是

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

for(id=0;idGah,这就是手头没有一些不太酷的浏览器可供测试的原因:/Gah,这就是手头没有一些不太酷的浏览器可供测试的原因:/