jQuery – 为什么我不能将事件绑定到循环中的元素?
这是我的代码:
var b = $(slipStream.conf.mainVis).find('p#prev'); b.click(function() { slipStream.slideLeft(); return false; }); b = $(slipStream.conf.mainVis).find('p#next'); b.click(function() { slipStream.slideRight(); return false; }); b = $(slipStream.conf.controls).find('li img'); console.log(b); for (var l in b) { l.click(function() { var visIndex = l.index(); console.log(visIndex); }); };
前两个绑定经过,没问题。 但是我不能遍历集合并将某些东西绑定到每个成员? (控制台告诉我“l.click不是一个函数。”)这是jQuery的限制还是我的代码关闭? 这似乎是这样做的方式,但是……
当您枚举jQuery对象时,枚举的值是实际的DOM节点而不是jQuery包装器。 因此,他们没有click
方法,但您可以再次包装它们以获得所有常用function。
当然这不是必需的,因为您可以直接从初始jQuery实例附加包装器:
$(slipStream.conf.controls).find('li img').click(function() { var visIndex = $(this).index(); console.log(visIndex); });
这是经典的“循环变量在回调中无法正常工作”的错误。
在调用回调时,您的变量l
不再具有最初提供的值 – 它具有在循环的最后一次传递中分配的任何最终值。
[FWIW, l
实际上不是一个jQuery对象,所以你必须将它包装起来 – $(l)
将它与jQuery一起使用]
循环错误的常见修复是创建一个额外的闭包, 返回 绑定到当前值的函数:
for (var l in b) { // NB: don't use `for ... in ...` on array-like objects! var make_cb = function(n) { return function() { var visIndex = $(n).index(); console.log(visIndex); } } $(l).click(make_cb(l)); };
幸运的是,您根本不需要循环 – 您可以让jQuery自动将回调添加到每个元素:
b = $(slipStream.conf.controls).find('li img'); b.click(function() { var visIndex = $(this).index(); console.log(visIndex); });
可能是问题是for
循环。 .click
是jQuery的一部分,所以你必须确保它是用jQuery包装的元素调用的。
$.each(b, function (index, element) { $(element).click(function() { }); };
使用each()
您可以遍历一组jQuery对象:
$(slipStream.conf.controls).find('li img').each(function(){ $(this).click(function() { var visIndex = $(this).index(); console.log(visIndex); }); });
$(this)
将匹配集合中当前索引的对象。