Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery-为什么可以';我不能将事件绑定到循环中的元素吗?_Javascript_Binding_Jquery - Fatal编程技术网

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()