2012-01-10 23 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");