2011-08-09 117 views
17

什麼存儲在QjQuery選擇器是否返回一個HTML元素或jQuery對象的數組?

Q = $('div'); 
Q2 = document.getElementsByTagName('div'); 

我可以通過使用Q[index],類似於Q2[index]訪問每個HTML元素;這使得它看起來像Q是一個HTML元素的數組。

在另一方面,我可以做Q.filter(),但我不能Q2.filter();這使得它看起來像Q是一個jQuery對象數組。

還是這兩個,其中Q是一個jQuery對象,它包含一堆HTML元素?如果是這種情況,console.log()不會檢測Q作爲一個對象的集合內的對象?這個小提琴,http://jsfiddle.net/rkw79/3s7tw/,表明它們是相同的。

注意:我知道Q.eq(index)將返回一個可以使用jQuery方法的對象。我只是想知道什麼是Q

回答

3

Q是一個對象。它欺騙並僞裝成一個實現所有常用數組函數的數組,因此firebug會這樣對待它。 (或者也許它從一個數組開始,但添加了一些東西。)

它包含一個包含所有先前選定元素的堆棧(因此您可以使用.end())它具有匹配元素的實際數組,這就是它。

嘗試:

for(i in $('body')) console.log(i) 

而且你會看到所有的功能等

13

結果是jQuery對象表現得像兩個HTMLElements一個數組,你使用[]arrayjQuery使用的對象eq(index);

+1

我還會注意到,迭代器'Q.each()'將HTMLElement對象傳遞給回調函數,因爲它像遍歷數組一樣遍歷Q.當我第一次使用jQuery時,這對我來說有些出乎意料,儘管如果你明白它將它視爲一個數組,那麼它就非常合理。 – Charles

6

在您的示例中,q(jQuery對象)是一個類似數組的對象,它實際上是所選DOM節點集合的一個包裝。考慮下面的例子:

HTML:

<div id="example"></div> 

JS:

alert($("#example")) //Alerts something like "Object" 
alert($("#example")[0]) //Alerts something like "HTMLDivElement" 
alert(document.getElementById("example")); //Alerts something like "HTMLDivElement" 

上面的第二示例訪問集合中的第一原始DOM元素(在此情況下,僅存在一個)。您可以通過使用jQuery get(index)方法實現相同,但我使用正常的數組語法來演示jQuery對象與數組類似。

jQuery包裝器對象允許您將其他jQuery方法應用於匹配的元素集。 DOM元素本身沒有這些方法,這就是爲什麼你的例子Q2.filter()不起作用。

Q2是一個原始DOM元素。作爲一個jQuery對象實際上是圍繞一組DOM元素的包裝,它完全有可能做到這一點:

alert($(document.getElementById("example"))); //Alerts something like "Object"

在該示例中,getElementById返回DOM元素,然後將其傳遞到jQuery函數,它返回類似數組的jQuery對象,允許您調用其他jQuery方法。

相關問題