通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤。
最常见的查找是在某个节点的所有子节点中查找,使用find()
方法,它本身又接收一个任意的选择器。例如如下的HTML结构:
- JavaScript
- Python
- Swift
- Scheme
- Haskell
<!-- 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>
用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
如果要从当前节点开始向上查找,使用parent()
方法:
// 获得Swift
var swf = $('#swift');
// 获得Swift的上层节点<ul>
var parent = swf.parent();
// 获得Swift的上层节点<ul>,同时传入过滤条件。
// 如果ul不符合条件,返回空jQuery对象
var a = swf.parent('.red');
对于位于同一层级的节点,可以通过next()
和prev()
方法,例如:
当我们已经拿到Swift
节点后:
var swift = $('#swift');
swift.next(); // Scheme
// 空的jQuery对象,
// 因为Swift的下一个元素Scheme不符合条件[name=haskell]
swift.next('[name=haskell]');
// Python
swift.prev();
// Python,因为Python同时符合过滤器条件.dy
swift.prev('.dy');
和函数式编程的map、filter类似,jQuery对象也有类似的方法。
filter()
方法可以过滤掉不符合选择器条件的节点:
// 拿到JavaScript, Python, Swift, Scheme和Haskell
var langs = $('ul.lang li');
// 拿到JavaScript, Python, Scheme
var a = langs.filter('.dy');
或者传入一个函数,要特别注意函数内部的this
被绑定为DOM对象,不是jQuery对象:
// 拿到JavaScript, Python, Swift, Scheme和Haskell
var langs = $('ul.lang li');
langs.filter(function () {
// 返回S开头的节点
return this.innerHTML.indexOf('S') === 0;
}); // 拿到Swift, Scheme
map()
方法把一个jQuery对象包含的若干DOM节点转化为其他对象:
// 拿到JavaScript, Python, Swift, Scheme和Haskell
var langs = $('ul.lang li');
var arr = langs.map(function () {
return this.innerHTML;
}).get(); // 用get()拿到包含string的Array:
// ['JavaScript', 'Python', 'Swift',
// 'Scheme', 'Haskell']
此外,一个jQuery对象如果包含了不止一个DOM节点,first()
、last()
和slice()
方法可以返回一个新的jQuery对象,把不需要的DOM节点去掉:
// 拿到JavaScript, Python, Swift, Scheme和Haskell
var langs = $('ul.lang li');
// JavaScript,相当于$('ul.lang li:first-child')
var js = langs.first();
// Haskell, 相当于$('ul.lang li:last-child')
var haskell = langs.last();
// Swift, Scheme, 参数和数组的slice()方法一致
var sub = langs.slice(2, 4);
对于下面的表单:
<form id="test-form" action="#0" onsubmit="return false;">
<p><label>Name: <input name="name"></label></p>
<p><label>Email: <input name="email"></label></p>
<p>
<label>Password:
<input name="password" type="password">
</label>
</p>
<p>Gender:
<label>
<input name="gender" type="radio" value="m" checked>
Male
</label>
<label>
<input name="gender" type="radio" value="f">
Female
</label>
</p>
<p><label>City: <select name="city">
<option value="BJ" selected>Beijing</option>
<option value="SH">Shanghai</option>
<option value="CD">Chengdu</option>
<option value="XM">Xiamen</option>
</select></label></p>
<p><button type="submit">Submit</button></p>
</form>
输入值后,用jQuery获取表单的JSON字符串,key和value分别对应每个输入的name和相应的value,例如:{"name":"Michael","email":...}
'use strict';
var json = null;
var obj = {};
$("form#test-form")
.find("input:text,:password,:radio,select")
.map(function() {
switch(this.type) {
case "text":
case "password":
obj[this["name"]] = this.value;
break;
case "radio":
if (this.checked) {
obj[this.parentElement.innerText] = this.checked;
}
break;
case "select-one":
obj[this["name"]] =
this.selectedOptions[0].innerText;
break;
}
return;
});
json = JSON.stringify(obj);
// 显示结果:
if (typeof(json) === 'string') {
console.log(json);
}
else {
console.log('json变量不是string!');
}