![](/img/trans.png)
[英]Problem in IE8 with GET Parameters in opening a new windows with javascript
[英]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.