一个例子看清楚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>

更直观的例子,可以参考这篇文章“jQuery笔记-jQuery筛选器children()详解”。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-24 20:52:00

一个例子看清楚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 个页面

[ jquery 子元素选择器 总结 ] 总结: 伪类子元素选择器

总结: 伪类中的子元素选择器: 第一种类型: :first-child :last-child :nth-child() :nth-last-child() 第二种类型: :only-child :only-of-type 第三种类型: :first-of-type :nth-last-of-type() :nth-of-type() 特点: 伪类选择器很有特点: 1.位置:可以直接通过伪类选择器直接获取开始 结束 和第几个,通常和目标元素在什么位置上有关,可以从正着数,也可以从倒着数,计数从

jquery子元素选择器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>子元素选择器</title>

深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器

× 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的jQuery>一书中,nth-of-type()选择器参照CSS中的nth-of-type选择器,于1.9版本新增,本文将详细介绍该内容 通用形式 :nth-of-type() 个人认为,:nth-of-type()选择器不应该归类于子元素选择器,也不完全等同索引选择器,因为其索引是指特定元素的索引,但

jQuery子元素过滤选择器

1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 <!-- jQuery子元素过滤选择器 --> 6 &l

后代选择器和子元素选择器的区别

原文 简书原文:https://www.jianshu.com/p/4a776598c69c 大纲 1.后代选择器和子元素选择器的相关概念 2.后代选择器和子元素选择器的区别 1.后代选择器和子元素选择器的相关概念 1.1.后代选择器 后代选择器(descendant selector)又称为包含选择器. 后代选择器可以选择作为某元素后代的元素. 我们可以定义后代选择器来创建一些规则,使这些规则在某些文档结构中起作用,而在另外一些结构中不起作用. h1 em {color:red;} 1.2.子

CSS 组合选择符:后代选择器、子元素选择器、相邻兄弟选择器、普通兄弟选择器

CSS 组合选择符 CSS 组合选择符 在 CSS3 中包含了四种组合方式:CSS组合选择符包括各种简单选择符的组合方式. 后代选择器(以空格分隔) 子元素选择器(以大于号分隔) 相邻兄弟选择器(以加号分隔) 普通兄弟选择器(以破折号分隔) 后代选择器 后代选择器用于选取某元素的后代元素. 以下实例选取所有 <p> 元素插入到 <div> 元素中: 实例 divp{background-color:yellow; } 子元素选择器 与后代选择器相比,子元素选择器(Child sel

H5 14-后代选择器和子元素选择器

14-后代选择器和子元素选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>14-后代选择器和子元素选择器</title> </head> <body> <!-- 1.后代选择器和子元素选择器之间的区别? 1.1 后代选择器使用空格作为连接符号 子元素选择器使用>作

Web全栈-子元素选择器

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>子元素选择器</title> <style> /* div>p{ color: red; } */ /* #identity>p{ color: blue; } */ div>ul>li>p{ color: purp