jQuery 提供三種向上遍歷祖先元素的方法,雖然名稱相似但行為差異極大。搞清三者機制,能精準選取目標元素,避免效能浪費與邏輯錯誤。本文以圖解、程式碼示範與對比表完整釐清。
| 方法 | 搜尋範圍 | 起始點 | 回傳數量 | 支援選擇器過濾 |
|---|---|---|---|---|
parent([selector]) | 僅父層 (1 層) | 父元素 | 0~多個 (對應集合中每個元素的父層) | 是 |
parents([selector]) | 所有祖先 (至 document) | 父元素 | 0~多個 (由內而外排序) | 是 |
closest(selector) | 祖先鏈 (含自身) | 自身 | 0 或 1 個 (首個符合者) | 必填 |
<div>
<p>
<span>
<b>My parents</b>
</span>
</p>
</div>
// 以 <b> 為起點
$('b').parents(); // → [span, p, div, body, html] (jQuery 物件,由內而外)
$('b').parent(); // → [span]
$('b').closest('p'); // → [p] (自身不符合,向上找第一個 p)
$('b').closest('b'); // → [b] (自身符合,直接回傳)
parent():單層、集合對應$('a').parent('.nav') 取所有 <a> 的父層中 class 為 nav 者。parents():全祖先鏈、由內而外<html> 在最後。$('#deep').parents('div.container')。closest() 低,因需走訪完整樹並建立完整集合。closest():含自身、短路優化$(e.target).closest('.item') 找到被點擊的列表項根節點。
需要包含自身嗎? → 是 → closest()
↓ 否
只需父層? → 是 → parent()
↓ 否
需所有祖先或多重篩選? → 是 → parents()
↓ 否
需第一個符合條件的祖先? → closest(selector)
parent() 最快。closest() 短路機制最優。parents(selector)。parents() 無選擇器版本。closest() 選擇器必填,無預設值。parents() 不包含自身,closest() 包含。parent() 對集合中每個元素各取父層,結果可能包含同層級不同父元素。掌握三者語意邊界,即能寫出精準、高效的 DOM 遍歷邏輯。