Javascript: проблема открытия окон в строке - PullRequest
0 голосов
/ 19 июля 2011

это мой 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 секунды после следующего.

Мне нужна эта строка: http://www.mysite.com/characterID=1, <a href="http://www.mysite.com/characterID=2" rel="nofollow">http://www.mysite.com/characterID=2</a>, <a href="http://www.mysite.com/characterID=3" rel="nofollow">http://www.mysite.com/characterID=3</a>...

Но он всегда открывается http://www.mysite.com/characterID=11

Как я могу это исправить?

Спасибо ...

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Это распространенная проблема.

Вы перезаписываете local_id в цикле и всегда ссылаетесь на одну и ту же переменную при выполнении кода.Это связано с тем, что JavaScript не имеет области видимости блока , только область действия функции.

Таким образом, чтобы охватить id, вам нужно вызвать функцию и определить там переменную (или параметр функции).

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 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);
}
1 голос
/ 19 июля 2011

Это потому, что 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);
}
0 голосов
/ 18 ноября 2016

Через много лет я хотел ответить на свой вопрос.Я не мог вспомнить, что я пытался сделать, но мое решение должно использовать let, а не var.let ограничен областью действия, а var - нет.

for(id=0;id<=10;id++){
    let local_id = id;    
    setTimeout(function() {
          console.log(local_id)
    }, 3000);
}
0 голосов
/ 19 июля 2011

Вы можете передать 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);
0 голосов
/ 19 июля 2011

Это классическая проблема закрытия 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();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...