jquery原始碼解析之遍歷後代
阿新 • • 發佈:2019-01-05
後代是子、孫、曾孫等等,通過 jQuery,您能夠向下遍歷 DOM 樹,以查詢元素的後代。
下面是兩個用於向下遍歷 DOM 樹的 jQuery 方法:
children()
find()
jQuery children() 方法
獲得匹配元素集合中每個元素的子元素,選擇器選擇性篩選。
因為就jQuery可以是一個DOM的合集物件,所以children就需要遍歷每一個合集中的直接子元素了,並且最後需要構建一個新的jQuery物件。
jQuery find() 方法
1、.find()方法返回被選元素的後代元素,一路向下直到最後一個後代。
2、.find()方法允許我們能夠通過查詢DOM樹中的這些元素的後代元素,匹配的元素將構造一個新的jQuery物件。
3、.find()和.children()方法是相似的,但後者只是再DOM樹中向下遍歷一個層級。
4、.find()方法還可以接受一個選擇器表示式,該選擇器表示式可以是任何可傳給$()函式的選擇器表示式。如果緊隨兄弟匹配選擇器,它將被保留在新構建的jQuery物件中;否則,它被排除在外。
這個方法用的概率相當高,除了接受一個選擇器外,還可以接受一個jQuery物件,我們可以看到.find()方法的內部實際上是呼叫的jQuery.find 也就是sizzle的引擎選擇器。
當然在高階版本中我們大多數可以這樣處理:
function find(elem, selector) {
return elem.querySelectorAll(selector);
}
通過在指定的上下文,通過querySelectorAll直接查找出元素,具體是sizzle在之前就分析過了。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="http://img.mukewang.com/down/540812440001e40e00000000.js" type="text/javascript"> </script>
<!-- <script type="text/javascript" src="../jquery-2.1.1.js"></script> -->
<title></title>
</head>
<body>
<button id="test1">jQuery children方法</button>
<button id="test2">模擬children方法</button>
<div></div>
<ul class="level-1">
<li class="item-i">I</li>
<li class="item-ii">II
<ul class="level-2">
<li class="item-a">A</li>
<li class="item-b">B
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>
</li>
<li class="item-c">C</li>
</ul>
</li>
<li class="item-iii">III</li>
</ul>
<script type="text/javascript">
$("#test1").click(function(){
$('.level-2').children().each(function(i,ele){
$('div').append('<li>jQuery.children方法,子元素的className為:'+ ele.className + '</li>')
})
})
$("#test2").click(function() {
function sibling(n, elem) {
var matched = [];
for (; n; n = n.nextSibling) { //如果存在下一個兄弟節點
if (n.nodeType === 1 && n !== elem) { //是元素節點,且不是當前選擇器元素
matched.push(n);
}
}
return matched;
}
var ul = document.querySelectorAll('.level-2')[0];
//遍歷所有元素
$.each(sibling(ul.firstChild), function(i, ele) {//ul.firstChild 為文字節點
$('div').append('<li>模擬children方法,子元素的className為:' + ele.className + '</li>')
})
})
</script>
</body>
</html>
思路是:查詢ul的所有子元素,先查詢ul的第一個子節點,為文字節點;找出該節點的所有的同胞元素節點,存入陣列中,該陣列即為ul的所有子元素