1、查找 find()、parent()、prev()、next()

通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤。

最常见的查找是在某个节点的所有子节点中查找,使用find()方法,它本身又接收一个任意的选择器。

例如有如下HTML结构:
<!-- HTML结构 -->
<ul class="lang">
<li class="js dy">JavaScript</li>
<li class="dy">Python</li>
<li id="swift">Swift</li>
<li class="dy">Scheme</li>
<li name="haskell">Haskell</li>
</ul>
8
 
1
<!-- HTML结构 --> 
2
<ul class="lang">
3
    <li class="js dy">JavaScript</li>
4
    <li class="dy">Python</li>
5
    <li id="swift">Swift</li>
6
    <li class="dy">Scheme</li>
7
    <li name="haskell">Haskell</li>
8
</ul>

使用find()查找:
var ul = $('ul.lang'); // 获得<ul>
var dy = ul.find('.dy'); // 获得JavaScript, Python, Scheme
var swf = ul.find('#swift'); // 获得Swift
var hsk = ul.find('[name=haskell]'); // 获得Haskell
4
 
1
var ul = $('ul.lang'); // 获得<ul>
2
var dy = ul.find('.dy'); // 获得JavaScript, Python, Scheme
3
var swf = ul.find('#swift'); // 获得Swift
4
var hsk = ul.find('[name=haskell]'); // 获得Haskell

如果要从当前节点开始向上查找,使用parent()方法:
var swf = $('#swift'); // 获得Swift
var parent = swf.parent(); // 获得Swift的上层节点<ul>
var a = swf.parent('div.red'); // 从Swift的父节点开始向上查找,直到找到某个符合条件的节点并返回
3
 
1
var swf = $('#swift'); // 获得Swift
2
var parent = swf.parent(); // 获得Swift的上层节点<ul>
3
var a = swf.parent('div.red'); // 从Swift的父节点开始向上查找,直到找到某个符合条件的节点并返回

对于位于同一层级的节点,可以通过next()和prev()方法,例如:
var swift = $('#swift');

swift.next(); // Scheme
swift.next('[name=haskell]'); // Haskell,因为Haskell是后续第一个符合选择器条件的节点 swift.prev(); // Python
swift.prev('.js'); // JavaScript,因为JavaScript是往前第一个符合选择器条件的节点
x
 
1
var swift = $('#swift');
2

3
swift.next(); // Scheme
4
swift.next('[name=haskell]'); // Haskell,因为Haskell是后续第一个符合选择器条件的节点
5

6
swift.prev(); // Python
7
swift.prev('.js'); // JavaScript,因为JavaScript是往前第一个符合选择器条件的节点


2、遍历处理:过滤 filter()、map()

2.1 filter()

filter()方法可以过滤掉不符合选择器条件的节点:
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var a = langs.filter('.dy'); // 拿到JavaScript, Python, Scheme
2
 
1
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
2
var a = langs.filter('.dy'); // 拿到JavaScript, Python, Scheme

或者可以传入一个函数,特别注意函数内部的this被绑定为DOM对象,而不是jQuery对象:
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
langs.filter(function () {
return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点
}); // 拿到Swift, Scheme
4
 
1
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
2
langs.filter(function () {
3
    return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点
4
}); // 拿到Swift, Scheme

2.1 map()

map()把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的jQuery对象。由于返回值是jQuery封装的数组,使用 get() 来处理返回的对象以得到基础的数组。

在callback函数中,this引用每次迭代的当前DOM元素,而不是jQuery对象,所以如果获取例如value,无法使用诸如val()方法,而要使用 .value 属性来获取。

直白地说,map()方法把一个jQuery对象包含的若干DOM节点转化为其他对象:
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var arr = langs.map(function () {
return this.innerHTML;
}).get(); // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell']
4
 
1
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
2
var arr = langs.map(function () {
3
    return this.innerHTML;
4
}).get(); // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell']

获取的jQuery对象的DOM节点,例如可以通过如此方法直接转换为如所需id的数组,传给后台。
如下,不使用map,我想传递一个id数组:
//通过迭代数据加入到数组中
var studentList = $("#beforeInTable :checked");
var studentsArray = [];
studentList.each(function() {
studentsArray.push($(this).val());
});
6
 
1
//通过迭代数据加入到数组中
2
var studentList = $("#beforeInTable :checked");
3
var studentsArray = [];
4
studentList.each(function() {
5
    studentsArray.push($(this).val());
6
});
如下,使用map,我可以直接获得一个id数组:
var studentsArray = $("#beforeInTable :checked").map(function(){
return this.value;
}).get();
3
 
1
var studentsArray = $("#beforeInTable :checked").map(function(){
2
    return this.value;
3
}).get();

还可以结合Array的 join() 方法,把数组中所有元素放入一个字符串,通过指定的分隔符进行分割:
var studentsArrayStr = $("#beforeInTable :checked").map(function(){
return this.value;
}).get().join(",");
//"82,83"
4
 
1
var studentsArrayStr = $("#beforeInTable :checked").map(function(){
2
    return this.value;
3
}).get().join(",");
4
//"82,83"
这种方式在前后台交互中传递数据会很常用,使用数组或者拼接字符串。


此外,一个jQuery对象如果包含了不止一个DOM节点,first()、last()和slice()方法可以返回一个新的jQuery对象,把不需要的DOM节点去掉:
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
var js = langs.first(); // JavaScript,相当于$('ul.lang li:first-child')
var haskell = langs.last(); // Haskell, 相当于$('ul.lang li:last-child')
var sub = langs.slice(2, 4); // Swift, Scheme, 参数和数组的slice()方法一致
 
1
var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell
2
var js = langs.first(); // JavaScript,相当于$('ul.lang li:first-child')
3
var haskell = langs.last(); // Haskell, 相当于$('ul.lang li:last-child')
4
var sub = langs.slice(2, 4); // Swift, Scheme, 参数和数组的slice()方法一致


最新文章

  1. Win7下完全卸载Oracle 11g
  2. Atom 安装 Packages 的笨办法
  3. 设计模式之美:Observer(观察者)
  4. 《C#图解教程》读书笔记之二:存储、类型和变量
  5. ubuntu用apt-get安装memcache
  6. SQL Analysis Services MDX 查询超时 解决办法
  7. 【最后一篇API译文】Android开发-API指南- Contacts Provider
  8. bzoj1444
  9. CAEmitterLayer 粒子发射器
  10. unity3d中让物体显示和隐藏
  11. 一个简单的RPC框架
  12. windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境)
  13. java 非缓冲与缓冲数据读取比较
  14. 推荐使用国内的豆瓣源安装Python插件
  15. MyBatis的三层级联和二层缓存
  16. Kotlin 检查空类型
  17. Servlet和Filter的区别
  18. styled-components的基本使用
  19. vue-cli3安装创建项目以及目录结构
  20. javaScript事件(七)事件类型之键盘与文本事件

热门文章

  1. Maven详解(三)------ Maven工程目录介绍
  2. 通过 BitNami 轻松安装 Redmine
  3. GC选择之CMS 并发标记清除
  4. php ddos 安全处理代码
  5. poj 1182 食物链 带权并查集
  6. Java设计模式 (转)
  7. spring学习笔记1
  8. Sass之Compass学习笔记
  9. ZOJ 3811 Untrusted Patrol The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
  10. QT creator编程C++第一步,说“Hello world!”