1. 程式人生 > >一個例子看清楚JQuery子元素選擇器children()和find()的區別

一個例子看清楚JQuery子元素選擇器children()和find()的區別

最近在我們的hybrid app專案開發中定位出了一個問題,通過這個問題了解下JQuery選擇器find()和children()的區別。問題是這樣的:我們的混合app是一個單頁面應用(main.html),邏輯上的頁面是通過專案自定義的.mspl檔案(其實就是html檔案)來呈現的。比如a.mspl、b.mspl、c.mspl載入的時候,都會插入到main.html中,但是每次只顯示1個mspl檔案,當b.mspl顯示的時候,a.mspl和c.mspl就會被隱藏。在a、b、c這3 個頁面上都會顯示當前手機網路是否可用。當用戶開啟或者關閉手機網路的時候,會通過android廣播呼叫webview裡面的方法,重新整理a、b、c這3個頁面上顯示的網路狀態。

main.html結構如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="jquery-1.11.1.min.js"></script>
  </head>
  <body>
    <div page="a.mspl">
		<div spl-id="net_status">  
			<span>a</span>
			<span>1</span>
		</div>
	</div>
	
	<div page="b.mspl">
		<div spl-id="net_status">  
			<span>b</span>
			<span>2</span>
		</div>
	</div>
	
	<div page="c.mspl">
		<div spl-id="net_status">  
			<span>c</span>
			<span>3</span>
		</div>
	</div>
  </body>
</html>

當網路狀態發生變化的時候,android會通過webview呼叫下面的JS方法,重新整理頁面顯示的網路狀態:

//online offline
function refreshNetworkStatus(status)
{
	// 選中每一個mspl下網路狀態顯示欄
	var selector = $("div[spl-id='net_status']");
	
	// 網路狀態顯示欄下面有2個span,第一個是用來顯示網路狀態的
	$(selector).children("span:eq(0)").text(offlineTip);	
}
問題是:當我們開啟或者關閉網路連線,a.mspl能夠正確顯示網路狀態,但是b.mspl和c.mspl中的網路狀態顯示欄不能重新整理。專案模擬程式碼如下:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="jquery-1.11.1.min.js"></script>
	
	<script>
		$(function(){
		
			$("button").click(function(){	
				var selector = $("div[spl-id='net_status']");
				var text = $(this).text();
				
				//重新整理網路狀態顯示
				$(selector).children("span:eq(0)").text(text);
			});
		
		});
	</script>
	
  </head>
  <body>
	
	<div page="a.mspl">
		<div spl-id="net_status">  
			<span>a</span>
			<span>1</span>
		</div>
		<button>online</button>
		<button>offline</button>
	</div>
	
	<div page="b.mspl">
		<div spl-id="net_status">  
			<span>b</span>
			<span>2</span>
		</div>
		<button>online</button>
		<button>offline</button>
	</div>
	
	<div page="c.mspl">
		<div spl-id="net_status">  
			<span>c</span>
			<span>3</span>
		</div>
		<button>online</button>
		<button>offline</button>
	</div>	
  </body>
</html>
可以看到我們點選online或者offline按鈕,只有a.mspl下的網路狀態顯示欄能正常。如果不使用children(),而是使用find()就可以滿足要求了。當點選online或者offline按鈕時候,3個頁面的網路狀態顯示都是正常的。
$(selector).find("span:eq(0)").text(text);

children()和find()的差別在於:

1.children方法獲得的僅僅是元素一下級的子元素,即:immediate children

2.find方法獲得所有下級元素,即:all descendants 

3.children方法的引數selector是可選的,用來過濾子元素;但find方法的引數selector方法是必選的。

$(selector).children("span:eq(0)")的作用相當於$(selector).children().eq(0)

1.獲取selector下的所有直接span,即結果是<span>a</span>,<span>1</span>,<span>b</span>,<span>2</span>,<span>c</span>,<span>3</span>

2.eq(0)選中的是第一個元素,所以改變的是<span>a</span>

$(selector).find("span:eq(0)").text(id);
的作用相當於
$(selector).each(function(){
    $(this).children("span:eq(0)").text(id);
});
1.對於selector選中的每一個元素,都再用"span:eq(0)"篩選一次,即結果是<span>a</span>,<span>b</span>,<span>c</span>