如何用Javascript中的循环生成事件处理程序?
例如,我有10个由AJAX响应生成的标签:
<a href="#" id="b1">b1</a> <a href="#" id="b2">b2</a> <a href="#" id="b3">b3</a> <a href="#" id="b4">b4</a> <a href="#" id="b5">b5</a> <a href="#" id="b6">b6</a> <a href="#" id="b7">b7</a> <a href="#" id="b8">b8</a> <a href="#" id="b9">b9</a> <a href="#" id="b10">b10</a>
我需要通过循环分配onclick事件给他们每个人:
for(i=1; i<11; i++) { document.getElementById("b"+i).onclick=function() { alert(i); } }
这不起作用,它只分配onclick到最后一个标签,并警告“11”。 我怎样才能使这个工作? 我不喜欢使用jQuery。
所有的处理程序都共享相同的variables。
你需要把每个处理程序放到一个单独的函数中,以i
作为参数,以便每个函数获取自己的variables:
function handleElement(i) { document.getElementById("b"+i).onclick=function() { alert(i); }; } for(i=1; i<11; i++) handleElement(i);
closures是你在找什么:
for(i=1; i<11; i++) { (function(i) { document.getElementById("b"+i).onclick=function() { alert(i); }; })(i); }
在这个问题上有两种使用闭包的方法。 这个想法是为事件处理程序使用的每个迭代创build一个带有“i”variables快照的范围。
解决scheme#1(正如凯文提到的):
for(i=1; i<11; i++) { (function(num) { document.getElementById("b"+num).addEventListener('click', function() { alert(num); }); })(i); }
解决scheme2:
for (i=1; i<11; i++) { document.getElementById("b"+i).addEventListener('click', (function(){ var num = i; return function() { alert(num); } })()); }