近期在我们的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()的差别的更多相关文章

  1. jquery子元素选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

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

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 本文是子元素选择器的续篇,主要介绍关于nth-of-type()选择器的内容.该部分内容并非没有出现在<锋利的 ...

  3. 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...

  4. CSS 子元素选择器与后代选择器区别实例讲解

    css子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...

  5. CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解

    派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...

  6. CSS选择器的组合选择器之后代选择器和子元素选择器

    实例代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

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

    14-后代选择器和子元素选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  8. weex中css不能使用子元素选择器

    weex中css不能使用子元素选择器 刚入手可能会有错误,有误导地方请谅解,不过都是亲身踩坑

  9. 前端学习笔记之CSS后代选择器、子元素选择器、相邻兄弟选择器区别与详解

    派生选择器用的很多,派生选择器具体包括为后代选择器.子元素选择器.相邻兄弟选择器,我们来理解一下他们之间的具体用法与区别. 1.css后代选择器语法:h1 em {color:red;} 表示的是从h ...

随机推荐

  1. 校网助手APP lua源码

    import 'android.webkit.WebView'webView.addJavascriptInterface({},'JsInterface') import 'test' cjson= ...

  2. Codewars练习Python

    计算一个数组的中间数,数的两边和相等,并返回index值 如:数组[1,2,3,4,6] 返回3(数组序号从0开始) def find_even_index(arr): ""&qu ...

  3. HP M177打印机驱动安装问题与解决

    问题描述 采购HP Color LaserJet Pro MFP M177 PCLmS一台,采用局域网WIFI网络与办公室各电脑连接.安装打印机自带光盘驱动,发现有些电脑安装驱动失败,提示“出现严重错 ...

  4. Java_大数值_16.5.12

    如果基本的整数和浮点数精度不能满足要求,那么可以使用java.math包中的BigInteger和BigDecimal这两个类.这两个类可以处理包含任意长度数字序列的数值.BigInteger类实现了 ...

  5. 并发编程学习笔记(6)----公平锁和ReentrantReadWriteLock使用及原理

    (一)公平锁 1.什么是公平锁? 公平锁指的是在某个线程释放锁之后,等待的线程获取锁的策略是以请求获取锁的时间为标准的,即使先请求获取锁的线程先拿到锁. 2.在java中的实现? 在java的并发包中 ...

  6. 实现加载页Loading Page 的几种方法

    网页也可以像原生应用那样加入进度条或者其他的loading效果带来更好的等待体验,这里归纳几种我收集的实现loading page的方法,这几种方法在交互上都有利有弊,适用于不同应用.(PS:以下方法 ...

  7. Python学习-if条件语句

    Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 单分支条件语句 if 判断条件: 条件成立,执行该代码块.... 注意:与其他编程语言,如Java和C ...

  8. ubuntu 常见的操作命令

    原博客地址为:https://blog.csdn.net/qq_33421080/article/details/76551554 1.cd命令: cd:切换到当前用户根目录,默认[/home/用户名 ...

  9. Ubuntu下安装oh-my-zsh

    本文参考 https://www.jianshu.com/p/9a5c4cb0452d 此文已在ubuntu下确实安装成功,只不过懒得截图了,可以参照上述地址,我在他原基础上进行了一些更改. 安装Oh ...

  10. Python基础-获取当前目录,上级目录,上上级目录

    import os print '***获取当前目录***' print os.getcwd() print os.path.abspath(os.path.dirname(__file__)) pr ...