2009-11-14 3 views
3

Можно создать дубликат:
Passing values to onclickЗакрытие в Javascript

У меня есть 100 элементов с идентификаторами divNum0, ..., divNum99. При каждом щелчке следует позвонить doTask с правильным параметром.

Код, к сожалению, не закрывает i, и, следовательно, doTask вызывается со 100 для всех элементов.

function doTask(x) {alert(x);} 

for (var i=0; i<100; ++i) { 
    document.getElementById('divNum'+i).addEventListener('click',function() {doTask(i);},false); 
} 

Есть ли каким-то образом я могу сделать функцию с именем с правильными параметрами?

+0

, если вам не нужно, чтобы добавить больше одного слушателя событий, вы должны назначить 'onclick', как это работает во всех браузерах – Christoph

+0

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

ответ

2

Создать замыкание через самостоятельное выполнение функции буквальной (или именованную фабричную функцию)

function doTask(x) { alert(x); } 

for(var i = 100; i--;) { 
    document.getElementById('divNum' + i).onclick = (function(i) { 
     return function() { doTask(i); }; 
    })(i); 
} 

или использовать узел DOM для хранения информации

function doTask() { alert(this.x); } 

for(var i = 100; i--;) { 
    var node = document.getElementById('divNum' + i); 
    node.x = i; 
    node.onclick = doTask; 
} 

Последнее больше памяти людей так как не создаются лишние объекты функции.

+0

NB: точнее сказать [выражение, вызываемое немедленно, вызывается] (https://en.m.wikipedia.org/wiki/Immediately-invoked_function_expression) :) –

3

Хотя (правильный) ответ the duplicate, я хотел бы указать более продвинутый метод - замену циклов на итераторы, что эффективно решает проблему закрытых javascript «поздних границ».

loop = function(start, end, step, body) { 
    for(var i = start; i != end; i += step) 
     body(i) 
} 

loop(1, 100, 1, function(i) { 
    // your binding stuff 
}) 
Смежные вопросы