2012-01-10 79 views
6

我正在使用同时使用jQuery和underscore.js的应用程序。我希望能够使用一些下划线的迭代器函数,例如any()all()来覆盖jQuery对象的集合。有没有办法做到这一点?我想要做类似如下的内容:在jQuery对象集合上使用underscore.js列表函数

checkboxes = $("input[type=checkbox]"); 
_.filter(checkboxes, function(box) { 
    return box.is(":checked"); 
}); 

但是这将引发一个错误:

Uncaught TypeError: Object #<HTMLInputElement> has no method 'is' 

所以我假设在这种情况下框没有表现得像一个jQuery对象。

+1

是不是有一个原因不只是做'$(“input [type = checkbox]:checked”)'? – Esailija 2012-01-10 20:26:03

+0

在这种情况下,我可以这样做,但我一般会询问所有的下划线交互方法,包括_.any(),_.all()等。 – GSto 2012-01-10 21:03:20

+2

在处理一个元素时,您很少需要jQuery时间,例如你可以刚刚完成'return box.checked'; – Esailija 2012-01-10 21:10:04

回答

13

您有jQuery的包装box

checkboxes = $("input[type=checkbox]"); 
checkboxes = _.filter(checkboxes, function(box) { 
    return $(box).is(":checked"); 
}); 

此外,而不是建立在集合中的每一个元素的新对象,你可以只使用本地box.checked

checkboxes = $("input[type=checkbox]"); 
checkboxes = _.filter(checkboxes, function(box) { 
    return box.checked; 
}); 

附注:jQuery has its own filter method

checkboxes = $("input[type=checkbox]").filter(function() { 
    return $(this).is(":checked"); 
}); 

此外,在你的例子 - 你确定你必须过滤吗?你可以很方便地使用它作为你的选择:

checkboxes = $("input[type=checkbox]:checked") 
+0

过滤器只是一个例子。我也想过在某些情况下使用_.any,_.all等。 – GSto 2012-01-10 21:02:36

+0

@约瑟夫,谢谢 - 这帮了我。你能解释一下为什么'你必须在jQuery中包装盒子? – 2016-07-15 14:28:00

+0

@KevinMeredith - 每当你遍历一个jQuery集合,它的单个项目都是简单的香草DOM元素。如果你想获得jQuery的功能,你必须创建一个新的jQuery实例。 – 2016-07-15 19:41:20

1

这里boxHTMLInputElement类型的对象。它不是一个jQuery对象。由于.is是一个jQuery对象方法,您需要从box获取jQuery对象。

它可以由$(box)完成。然后申请.is()

$(box).is(":checked");