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)将匹配集合中当前索引的对象。