2012-12-29 3 views
0

Я уже знаю, как петля, благодаря замыканию, как это:Javascript укупорочные: Loop внутри петли

for (var i = first; i <= last; i++) { 
    document.getElementById(more + i).onmouseover = (function(arg1) { 
     return function() { 
      document.getElementById(arg1).style.display = "block"; 
     } 
    })(i); 
} 

Но я хотел бы сейчас, чтобы сделать внешний вид внутри цикла. У меня есть элементы DOM, которые должны быть динамически привязаны к другим элементам. Элементы имеют тип: '1text1', '1text2', '1text3',... и '2text1', '2text2', '2text3', '3text4'... Я пытался что-то вроде этого:

var text; 
var ktext; 
for (var k = 1; k <= last_number; k++) { 
    for (var i = first; i <= last; i++) { 
     ktext = k + text; 
     document.getElementById(ktext + i).onmouseover = (function(arg1, arg2) { 
      return function() { 
       document.getElementById(arg1 + arg2).style.display = "block"; 
      } 
     })(ktext, i); 
    } 
} 

Но петля частично теряется. Если я положил alert(ktext + i) только в начале цикла var i, я вижу: 1text1, 1text2, 1text3, 1text4, затем(как ожидалось), но не 2text2, 2text3..., как если бы второй проход цикла var k останавливался слишком рано.

+1

Вы привязываете обработчики событий в цикле? Вы рассматривали делегирование событий? –

+0

Вы используете переменную 'text' перед ее инициализацией. – 0x499602D2

ответ

2

Использование замыканий является ненужным:

for(k=1; k<=last_number; k++) { 
    for(i=first; i<=last; i++) { 
    document.getElementById(k+text+i).onmouseover = function() { 
     this.style.display = "block"; 
    } 
    } 
} 

Во всяком случае, ваш цикл может быть остановки рано, если один из элементов не существует на этой странице. Вы должны проверить существование элемента, прежде чем пытаться его назначить.

+0

Мой плохой, я хотел упростить, чтобы опубликовать свой код здесь, и я вырезал некоторые полезные части: например: document.getElementById (arg1 + arg2 + more) .style.display = "block" 'Эти два элемента разные – ThePhi

+0

Ну, в любом случае вы можете получить идентификатор элемента с помощью 'this.id', поэтому, возможно, вы можете использовать это вместо того, чтобы создавать много закрытий. Вы даже можете делегировать событие, чтобы полностью удалить циклы и просто выполните: document.body.onclick = function (e) {e = e || window.event; var t = e.srcElement || e.target; var id = t.id;/* теперь делайте материал на основе идентификатора * /}; ' –

+0

Спасибо! Это именно то, что я искал. Я сделаю это! – ThePhi

Смежные вопросы