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

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

csdn 連接 網絡 type 文章 java main on() track

近期在我們的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>

更直觀的樣例,能夠參考這篇文章“jQuery筆記-jQuery篩選器children()具體解釋”。

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