2015-03-25 2 views
0

Я пытаюсь создать на лету элемент a и установить его функцией щелчка с предупреждением. Я знаком с закрытием в JavaScript, поэтому я знаю, что не могу называть его напрямую, как doc.onclick=function() {alert(i);}, так как он будет иметь значение последнего i. поэтому я попытался вызвать функцию сразу, но сразу же всплывает предупреждение. как я могу решить эту проблему?Создайте элементы в цикле и используйте разные значения.

for (var i=0; i < 5; ++i) { 
     var doc = document.createElement("a"); 
     doc.innerHTML = i; 
     doc.onclick = function(i) {alert(i);}(i); 
     document.body.appendChild(doc); 
    } 
+0

Я думаю, что вы пытаетесь эмулировать следующее: 'doc.onclick = function() {alert (this.innerHTML); }; 'или' doc.addEventListener ('click', function() {alert (this.innerHTML);}); ' – Phylogenesis

ответ

3

Вы должны вернуть функцию закрытия здесь. Как только вы открыли свою функцию сразу, это не сработает.

for (var i=0; i < 5; ++i) { 
    var doc = document.createElement("a"); 
    doc.innerHTML = i; 
    doc.onclick = function(i) { 
     return function(){alert(i);}; 
    }(i); 
    document.body.appendChild(doc); 
} 
+0

Спасибо, и ваше решение @marsh работает правильно. , но какое решение является наилучшей практикой? – Dino

+1

Я не думаю, что это имеет значение. В зависимости от того, что вам легче использовать и понять (включая просмотр кода через 2 года). – Scimonster

4

Вы должны обернуть что-то вроде этого:

for (var i=0; i < 5; ++i) { 
     var doc = document.createElement("a"); 
     doc.innerHTML = i; 
     (function(i){ 
      doc.onclick = function() { 
       alert(i); 
      }; 
     })(i) 
     document.body.appendChild(doc); 
    } 

Таким образом, добавляет i к закрытию, DEMO

0

Измените код следующим образом:

for (var i=0; i < 5; ++i) { 
     var doc = document.createElement("a"); 
     doc.innerHTML = i; 
     document.body.appendChild(doc); 
     doc.onclick = function() {alert(this.innerHTML);}; 
    } 
+0

также, смотрите его в прямом эфире @ this JSFiddle http://jsfiddle.net/3Lv016ja/ it предупреждает номер нажатого, это то, что вы ищете правильно? – Jasper

0

Я не что вы пытаетесь выполнить в обработчике событий, но, возможно, используете EventTarget.addEventListener:

for (var i = 0; i < 5; ++i) { 
 
    var doc = document.createElement("a"); 
 
    doc.innerHTML = i; 
 
    doc.addEventListener('click', function() { 
 
    alert(this.textContent); 
 
    }, false); 
 
    document.body.appendChild(doc); 
 
}

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