无法将事件绑定到包含jquery对象的数组

时间:2016-12-26 12:29:56

标签: javascript jquery

我动态创建了一个列表内容:

for (var i = 0; i<length; i++) {
    var $li = $('<li />', {
          text: ....
    }).appendTo($list);

    myArray.push($li);

    // This doesn't work
    $(myArray).click(function (e) { alert('cc'); });

但是当我得到所创建元素的父元素时,它可以工作

// This works
$('ul.liste').first().find('li').click(function (e) {alert('cc'); });
  1. $(myArray)$('ul.liste').first().find('li')之间的区别是什么?
  2. 如何正确地将js数组转换为jquery集合?我认为用$()包装数组会起作用,但显然不行。

4 个答案:

答案 0 :(得分:2)

您可以使用add

,而不是推送
var $set = $();
for (var i = 0; i<length; i++) {
    var $li = $('<li />', {
          text: ....
    }).appendTo($list);
    $set = $set.add($li);
}
$set.click(...

如果您更喜欢构建本机数组,然后将其转换为jQuery集合,那么您可以

var $set = $.add.apply($(), myArray);

答案 1 :(得分:2)

myArray是本机数组,你需要jQuery对象绑定$('ul.liste').first().find('li')返回的事件处理程序,因此它可以工作。

您可以使用.add()创建jQuery对象的集合,然后使用它来绑定事件处理程序。

&#13;
&#13;
//Create empty jQuery object
var myArray = $([]);
var $list = $('.list')
for (var i = 0; i < 5; i++) {
  var $li = $('<li />', {
    text: i
  }).appendTo($list);

  myArray = myArray.add($li);
}
// This doesn't work
myArray.click(function(e) {
  console.log(this.textContent);
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class='list'>
</ul>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您需要loop代替数组,

以下内容不正确,因为它未绑定相应元素上的click事件。

 $(myArray).click(function (e) { alert('cc'); });

而是循环为,

 $(myArray).each(function(){
     $(this).click(function (e) { alert('cc'); });
 });

答案 3 :(得分:1)

1)$(myArray)和$(&#39; ul.liste&#39;)之间的区别是什么?first()。find(&#39; li&#39; )吗

这里,myArray不是任何jQuery对象,而是包含jQuery对象作为其元素的普通数组。您永远不会将事件绑定到数组或字符串或任何其他数据类型。总是将事件绑定到jQuery对象(包含一些DOM元素)。因此,您应该逐个绑定myArray的每个元素,而不是绑定myArray。 当你使用$(&#39; ul.liste&#39;)时,它工作正常,因为它是一个带有一些DOM元素的jQuery对象。

2)如何正确地将js数组转换为jquery集合?我认为用$()包装数组会起作用,但显然不行。

您不能将js Array转换为jQuery对象。但是你将任何DOM元素转换为jQuery对象: 例如,

var elem = document.getElementById("myElem"); // a DOM element
$(elem) //a jQuery object

阵列只是为了保存一些数据而不是用于DOM操作。