2013-10-19 41 views
7

jQuery的documentation狀態jQuery最近 - 它是如何工作的?

對於組中的每一個元素,獲取通過測試元件本身並通過其在DOM樹遍歷的祖先了選擇相匹配的第一個元素。

這裏的操作詞在我眼中是始祖。這意味着如果使用

elem.closest(selector) 

而選擇器不是elem的祖先什麼都不會發現。然而,低一點倒在同一文件中讀取

遊記了DOM樹,直到找到一個匹配的供選擇

我解釋的理解是,它會一直走下去達到<身體>標記得到它的男人。請注意,父母祖先這裏沒有提及。

我寫了一個快速fiddle這似乎表明它是前者的聲明是正確的。不過,我認爲最好在這裏發帖,看看是否有其他人能證實這一點。

+0

這兩個陳述並不相互排斥,實際上它們的意思是相同的。它確實會達到標籤,它會去做文檔根目錄。 –

+0

你說得對,我想。這兩個陳述都沒有錯。但這仍然讓我感到有些困惑。在我的小提琴中,第一個輸入具有一個帶有data-x屬性的div作爲它的直接祖先,並且最接近的報告發現它。第二個輸入沒有像祖先這樣的div,但它確實存在作爲它的父div的兄弟,但它沒有被發現 – DroidOS

回答

7

.closest()作品像這樣(在僞代碼)的執行:

while (node) { 
    if (node matches selector) { 
    return node; 
    } 
    node := node.parentNode 
} 

換句話說,它僅由以下的母鏈橫穿起來。

+0

你的僞代碼證實了我看到的行爲。 'node:= node.previous'是我如何解釋文檔。 – DroidOS

+0

@DroidOS這將是'.prevAll(selector).first()':)的行爲 –

4

當它在第二個引號中顯示「向上移動DOM樹」時,它表示在您的第一個引用中「遍歷DOM樹中的祖先」。所引用的兩個陳述之間沒有區別。一個是對另一個的解釋,恰好是稍微不那麼具體。

+0

但是爲什麼在這種情況下點擊了我的小提琴中的第二個輸入 - 沒有div作爲直接父母承載data-x attrib - 最近找不到任何東西?如果它一直走到DOM樹,它應該找到第一個輸入的父div,它具有data-x屬性。 – DroidOS

+0

@DroidOS:是的,它什麼都沒發現。爲什麼它應該找到第一個輸入的父項,而不是第二個輸入的父項? – BoltClock

+0

這是我覺得困惑。現在你正在說_parent_。一分鐘前,我們正在討論如何升級DOM樹。走上DOM樹,我理解爲無論它是否是父母,它都會得到它的人。請注意,文檔根本沒有提及父項。 – DroidOS

1

jQuery nearest()選擇選擇器或選擇器本身(如果匹配)的第一個父元素(通過它的HTML標記)。這就像是你選擇'p'元素($('p#someid')),它會從你的'p'元素開始搜索,如果沒有匹配,它會移動到它的父元素。等

示例HTML:

<div id='select_me'>Div 
    <p id='id'>paragraph</p> 
</div> 

$( '#ID')最近('DIV)//將選擇的div#select_me,作爲最接近父DIV

其中作爲

<p id='select_me'>Div 
    <p id='select_me_now'>paragraph</p> 
</p> 

$('#select_me_now')closest(p); //將選擇p#select_me_now本身

1

.closest()方法搜索DOM樹中的這些元素及其祖先,並從匹配元素構造一個新的jQuery對象。

例:

$("li.item-a").closest("ul").css("background-color", "red"); 

這將改變二級的顏色,因爲它是第一次流通起來DOM樹時遇到的。