Javascript jQuery-为什么可以';我不能将事件绑定到循环中的元素吗?
这是我的密码:Javascript jQuery-为什么可以';我不能将事件绑定到循环中的元素吗?,javascript,binding,jquery,Javascript,Binding,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();
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的限制还是我的代码关闭了?这似乎是解决问题的方法,不过…问题可能在于
for
循环。click
是jQuery的一部分,所以必须确保它是在jQuery包装的元素上调用的
$.each(b, function (index, element) {
$(element).click(function() {
});
};
可能是因为
for
循环存在问题。click
是jQuery的一部分,所以必须确保它是在jQuery包装的元素上调用的
$.each(b, function (index, element) {
$(element).click(function() {
});
};
在jQuery对象上枚举时,所枚举的值是实际的DOM节点,而不是jQuery包装器。因此,它们没有
click
方法,但您可以再次包装它们以获得所有常用功能
当然,这不是必需的,因为您可以直接从初始jQuery实例附加包装器:
$(slipStream.conf.controls).find('li img').click(function() {
var visIndex = $(this).index();
console.log(visIndex);
});
在jQuery对象上枚举时,所枚举的值是实际的DOM节点,而不是jQuery包装器。因此,它们没有
click
方法,但您可以再次包装它们以获得所有常用功能
当然,这不是必需的,因为您可以直接从初始jQuery实例附加包装器:
$(slipStream.conf.controls).find('li img').click(function() {
var visIndex = $(this).index();
console.log(visIndex);
});
使用each()
可以迭代一组jQuery对象:
$(slipStream.conf.controls).find('li img').each(function(){
$(this).click(function() {
var visIndex = $(this).index();
console.log(visIndex);
});
});
$(此)
将匹配集合中当前索引的对象。使用each()
可以迭代一组jQuery对象:
$(slipStream.conf.controls).find('li img').each(function(){
$(this).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);
});
这是经典的“循环变量在回调中不能正常工作”错误
调用回调时,变量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);
});
你能试试
$(l)吗?点击(函数(){…})代码>替代?为什么不使用$。each(b)
或b.each()
?请参阅:和@m90大多数情况下,如果您正在执行$b.each()
您做错了…可以尝试$(l)吗。单击(function(){…})代码>替代?为什么不使用$。each(b)
或b.each()
?请参阅:和@m90大多数情况下,如果你在做$b。each()
你做错了…因为.index()
,因为l
不是jQuery集合。因为.index()
,因为l
不是jQuery集合。上面的第一个代码不起作用,因为它无法修复循环变量闭包问题。@Alnitak:确实;通过将索引
调用移出事件处理程序来修复此问题。谢谢您的关注。不,这仍然无法解决问题-visIndex
必须绑定到一个范围,而您修改后的代码仍然无法做到这一点。该错误不限于循环变量,它适用于循环内部但回调外部的任何变量更改。上面的第一个代码将不起作用,因为它无法修复循环变量关闭问题。@Alnitak:确实;通过将索引
调用移出事件处理程序来修复此问题。谢谢您的关注。不,这仍然无法解决问题-visIndex
必须绑定到一个范围,而您修改后的代码仍然无法做到这一点。该错误不限于循环变量,它适用于循环内部但回调外部的任何变量更改。。click()
对提供的jQuery对象执行隐式。each()
对提供的jQuery对象执行隐式。each()
对提供的jQuery对象执行隐式。each()