jQuery-选择器

一. 选择器

jQuery对象类似数组,它的每个元素都是一个引用了DOM节点的对象,查找不到返回空数组。

  1. id选择器:
var div = $('#abc');
  1. 类选择器:
var a = $('.red'); // 所有包含`class="red"`的节点都将返回
var a = $('.red.green'); // 查找同时具有两个类的元素,注意没有空格!

var icons = $('[class^="icon-"]'); // 找出所有class包含至少一个以`icon-`开头的DOM
// 例如: class="icon-clock", class="abc icon-home"
  1. 标签选择器:
var ps = $('p');   // 返回所有<p>节点

ps.length;       //页面<p>节点个数
  1. 按属性查找
一个DOM节点除了id和class外还可以有很多属性,很多时候按属性查找会非常方便,比如在一个表单中按属性来查找:

var email = $('[name=email]');       // 找出< name="email">

var passwordInput = $('[type=password]');     // 找出< type="password">

var a = $('[items="A B"]'); // 找出<??? items="A B">
当属性的值包含空格等特殊字符时,需要用双引号括起来。

按属性查找还可以使用前缀查找或者后缀查找:

var icons = $('[name^=icon]'); // 找出所有name属性值以icon开头的DOM
// 例如: name="icon-1", name="icon-2"
var names = $('[name$=with]'); // 找出所有name属性值以with结尾的DOM
// 例如: name="startswith", name="endswith"
  1. 交集选择器
组合查找就是把上述简单选择器组合起来使用。如果我们查找$('[name=email]'),很可能把表单外的<div name="email">也找出来,但我们只希望查找<input>,就可以这么写:

var emailInput = $('input[name=email]'); // 不会找出<div name="email">

同样的,根据tag和class来组合查找也很常见:
var tr = $('tr.red'); // 找出<tr class="red ...">...</tr>
  1. 并集选择器
$('p,div'); // 把<p>和<div>都选出来
$('p.red,p.green'); // 把<p class="red">和<p class="green">都选出来

选出来的元素是按照它们在HTML中出现的顺序排列的,且不会有重复元素。例如,<p class="red green">不会被上面的$('p.red,p.green')选择两次。

HTML结构如下

<!-- HTML结构 -->
<div class="testing">
    <ul class="lang">
        <li class="lang-javascript">JavaScript</li>
        <li class="lang-python">Python</li>
        <li class="lang-lua">Lua</li>
    </ul>
</div>
  1. 层级选择器
$('ul.lang li.lang-javascript'); 
// [<li class="lang-javascript">JavaScript</li>]

$('div.testing li.lang-javascript'); // [<li class="lang-javascript">JavaScript</li>]
  1. 子选择器(Child Selector)
子选择器$('parent>child')类似层级选择器,但是限定了层级关系必须是父子关系,就是<child>节点必须是<parent>节点的直属子节点。

$('ul.lang>li.lang-javascript');
 // 可以选出[<li class="lang-javascript">JavaScript</li>]

$('div.testing>li.lang-javascript'); // [], 无法选出,因为<div>和<li>不构成父子关系
  1. 过滤器(Filter)
过滤器一般不单独使用,它通常附加在选择器上,帮助我们更精确地定位元素。

$('ul.lang li'); // 选出JavaScript、Python和Lua 3个节点

$('ul.lang li:first-child'); // 仅选出JavaScript
$('ul.lang li:last-child'); // 仅选出Lua
$('ul.lang li:nth-child(2)'); // 选出第N个元素,N从1开始
$('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素
$('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素
  1. 表单相关
针对表单元素,jQuery还有一组特殊的选择器:

:input:可以选择<input>,<textarea>,<select>和<button>;

:file:可以选择<input type="file">,和input[type=file]一样;

:checkbox:可以选择复选框,和input[type=checkbox]一样;

:radio:可以选择单选框,和input[type=radio]一样;

:focus:可以选择当前输入焦点的元素,例如把光标放到一个<input>上,用$('input:focus')就可以选出;

:checked:选择当前勾上的单选框和复选框,用这个选择器可以立刻获得用户选择的项目,如$('input[type=radio]:checked');

:enabled:可以选择可以正常输入的<input>、<select> 等,也就是没有灰掉的输入;

:disabled:和:enabled正好相反,选择那些不能输入的。
  1. 选出可见的或隐藏的元素:
$('div:visible'); // 所有可见的div
$('div:hidden'); // 所有隐藏的div
  1. 用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()方法:

var swf = $('#swift'); // 获得Swift
var parent = swf.parent(); // 获得Swift的上层节点<ul>

var a = swf.parent('.red');
// 获得Swift的上层节点<ul>,同时传入过滤条件。如果ul不符合条件,返回空jQuery对象

同级查找:

通过next()和prev()方法,例如:

var swift = $('#swift');
swift.next(); // Scheme

swift.next('[name=haskell]'); 
// 空的jQuery对象,因为Swift的下一个元素Scheme不符合条件[name=haskell]

swift.prev(); // Python
swift.prev('.dy'); // Python,因为Python同时符合过滤器条件.dy
  1. 过滤
    filter()方法
filter()方法可以过滤掉不符合选择器条件的节点:

var langs = $('ul.lang li'); // 拿到.lang下的ul的li元素
var a = langs.filter('.dy'); // 拿到.dy类

可以传入一个函数,函数内部的this被绑定为DOM对象,不是jQuery对象:

langs.filter(function () {
    return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点
});     

// 拿到Swift, Scheme

map()方法

map()方法把一个jQuery对象包含的若干DOM节点转化为其他对象:

var arr = langs.map(function () {
    return this.innerHTML;
}).get();
 // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell']

此外,一个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()方法一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值