Jquery选择器

来源:互联网 发布:淘宝卖家不说话怎么办 编辑:程序博客网 时间:2024/06/10 00:17

Jquery选择器

Jquery查找方式

(1)按ID查找

如果某个DOM节点有id属性,利用jQuery查找如下:

// 查找<div id="abc">:var div = $('#abc');

注意,#abc#开头。返回的对象是jQuery对象。

**什么是jQuery对象?**jQuery对象类似数组,它的每个元素都是一个引用了DOM节点的对象。
以上面的查找为例,如果id为abc的

存在,返回的jQuery对象如下:

[<div id="abc">...</div>]

如果id为abc的

不存在,返回的jQuery对象如下:

[]

总之jQuery的选择器不会返回undefined或者null,这样的好处是你不必在下一行判断if (div === undefined)。
jQuery对象和DOM对象之间可以互相转化:

var div = $('#abc'); // jQuery对象var divDom = div.get(0); // 假设存在div,获取第1个DOM元素var another = $(divDom); // 重新把DOM包装为jQuery对象

通常情况下你不需要获取DOM对象,直接使用jQuery对象更加方便。如果你拿到了一个DOM对象,那可以简单地调用$(aDomObject)把它变成jQuery对象,这样就可以方便地使用jQuery的API了。

(2)按tag查找

按tag查找只需要写上tag名称就可以了:

var ps = $('p'); // 返回所有<p>节点ps.length; // 数一数页面有多少个<p>节点

(3)按class查找

按class查找注意在class名称前加一个.:

var a = $('.red'); // 所有节点包含`class="red"`都将返回// 例如:// <div class="red">...</div>// <p class="green red">...</p>

通常很多节点有多个class,我们可以查找同时包含red和green的节点:

var a = $('.red.green'); // 注意没有空格!// 符合条件的节点:// <div class="red green">...</div>// <div class="blue green red">...</div>

(4)按属性查找

一个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"这个方法尤其适合通过class属性查找,且不受class包含多个名称的影响:var icons = $('[class^="icon-"]'); // 找出所有class包含至少一个以`icon-`开头的DOM// 例如: class="icon-clock", class="abc icon-home"

(5)组合查找

组合查找就是把上述简单选择器组合起来使用。如果我们查找$('[name=email]'),很可能把表单外的<div name="email">也找出来,但我们只希望查找<input>,就可以这么写:

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

同样的,根据tag和class来组合查找也很常见:

var tr = $('tr.red'); // 找出<tr class="red ...">...</tr>

(6)多项选择器

多项选择器就是把多个选择器用,组合起来一块选:

$('p,div'); // 把<p>和<div>都选出来$('p.red,p.green'); // 把<p class="red">和<p class="green">都选出来

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

练习

使用jQuery选择器分别选出指定元素:
- 仅选择JavaScript
- 仅选择Erlang
- 选择JavaScript和Erlang
- 选择所有编程语言
- 选择名字input
- 选择邮件和名字input

<!-- HTML结构 --><div id="test-jquery">    <p id="para-1" class="color-red">JavaScript</p>    <p id="para-2" class="color-green">Haskell</p>    <p class="color-red color-green">Erlang</p>    <p name="name" class="color-black">Python</p>    <form class="test-form" target="_blank" action="#0" onsubmit="return false;">        <legend>注册新用户</legend>        <fieldset>            <p><label>名字: <input name="name"></label></p>            <p><label>邮件: <input name="email"></label></p>            <p><label>口令: <input name="password" type="password"></label></p>            <p><button type="submit">注册</button></p>        </fieldset>    </form></div>
'use strict'var selected=null;//选择JavaScriptselected = $('#para-1');//选择Erlangselected=$('.color-red.color-green');//选择JavaScript和Erlangselected=$('.color-red');//选择所有编程语言(属性选择器)selected=$("[class^='color-']")//选择名字inputselected=$("input[name='name']")//选择邮件和名字inputselected=$("input[name='email'],input[name='name']")if(!(selected instanceof jQuery)){    return alert('不是有效的Jquery对象');}$('#test-jquery').find('*').css('background-color','');selected.css('background-color','#ffd351');

层级选择器

(1)层级选择器(Descendant Selector)

如果两个DOM元素具有层级关系,就可以用$(‘ancestor descendant’)来选择,层级之间用空格隔开。例如:

<!-- 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>

要选出JavaScript,可以用层级选择器:

$('ul.lang li.lang-javascript'); // [<li class="lang-javascript">JavaScript</li>]$('div.testing li.lang-javascript'); // [<li class="lang-javascript">JavaScript</li>]

因为<div><ul>都是<li>的祖先节点,所以上面两种方式都可以选出相应的<li>节点。

要选择所有的<li>节点,用:

$('ul.lang li');

这种层级选择器相比单个的选择器好处在于,它缩小了选择范围,因为首先要定位父节点,才能选择相应的子节点,这样避免了页面其他不相关的元素。

例如:

$('form[name=upload] input');

就把选择范围限定在name属性为upload的表单里。如果页面有很多表单,其他表单的<input>不会被选择。

多层选择也是允许的:

$('form.test p input'); // 在form表单选择被<p>包含的<input>

(2)子选择器(Child Selector)

子选择器$('parent>child')类似层级选择器,但是限定了层级关系必须是父子关系,就是<child>节点必须是<parent>节点的直属子节点。还是以上面的例子:

$('ul.lang>li.lang-javascript'); // 可以选出[<li class="lang-javascript">JavaScript</li>]$('div.testing>li.lang-javascript'); // [], 无法选出,因为<div>和<li>不构成父子关系

(3)过滤器(Filter)

过滤器一般不单独使用,它通常附加在选择器上,帮助我们更精确地定位元素。观察过滤器的效果:

$('ul.lang li'); // 选出JavaScriptPythonLua 3个节点$('ul.lang li:first-child'); // 仅选出JavaScript$('ul.lang li:last-child'); // 仅选出Lua$('ul.lang li:nth-child(2)'); // 选出第N个元素,N1开始$('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素$('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素

(4)表单相关

针对表单元素,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正好相反,选择那些不能输入的。

此外,jQuery还有很多有用的选择器,例如,选出可见的或隐藏的元素:

$('div:visible'); // 所有可见的div$('div:hidden'); // 所有隐藏的div

练习

针对如下HTML结构:

<!-- HTML结构 --><div class="test-selector">    <ul class="test-lang">        <li class="lang-javascript">JavaScript</li>        <li class="lang-python">Python</li>        <li class="lang-lua">Lua</li>    </ul>    <ol class="test-lang">        <li class="lang-swift">Swift</li>        <li class="lang-java">Java</li>        <li class="lang-c">C</li>    </ol></div>
'use strict';var selected = null;// 分别选择所有语言,所有动态语言,所有静态语言,JavaScript,Lua,C等://选择所有语言(属性选择器)selected = $("[class^='lang-']");//选择所有动态语言selected=$("ul.test-lang li")//选择所有静态语言selected=$("ol.test-lang li")//选择JavaScriptselected=$("ul.test-lang li:first-child");//选择luaselected=$("ul.test-lang li:nth-child(3)");//选择Cselected=$("ol.test-lang li:nth-child(3)")// 高亮结果:if (!(selected instanceof jQuery)) {    return alert('不是有效的jQuery对象!');}$('#test-jquery').find('*').css('background-color', '');selected.css('background-color', '#ffd351');

查找和过滤

(1)最常见的查找是在某个节点的所有子节点中查找

使用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>

(2)如果要从当前节点开始向上查找,使用parent()方法:

var swf = $('#swift'); // 获得Swiftvar parent = swf.parent(); // 获得Swift的上层节点<ul>var a = swf.parent('div.red'); // 从Swift的父节点开始向上查找,直到找到某个符合条件的节点并返回

(3)对于位于同一层级的节点,可以通过next()和prev()方法,例如:

当我们已经拿到Swift节点后:

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

(4)过滤

和函数式编程的map、filter类似,jQuery对象也有类似的方法。

filter()方法可以过滤掉不符合选择器条件的节点:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskellvar a = langs.filter('.dy'); // 拿到JavaScript, Python, Scheme

或者传入一个函数,要特别注意函数内部的this被绑定为DOM对象,不是jQuery对象:

var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskelllangs.filter(function () {    return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点}); // 拿到Swift, Schememap()方法把一个jQuery对象包含的若干DOM节点转化为其他对象:var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskellvar 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, SchemeHaskellvar 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()方法一致

练习

对于下面的表单:

<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 inputs = $('#test-form');json = {};$('input:not(:radio),select').each(function(){    json[$(this).attr('name')]=$(this).val();});$('input:radio:checked').each(function(){    json[$(this).attr('name')]=$(this).val();});json=JSON.stringify(json);// 显示结果:if (typeof(json) === 'string') {    alert(json);}else {    alert('json变量不是string!');}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 高压147低压110怎么办 宣武医院怎么办住院证 自主择业后悔了怎么办 建行app闪退怎么办 自己有房怎么办居住证 性格懒散不工作怎么办 脚受凉脚后跟疼怎么办 月子里脚着凉怎么办 腿着凉了疼怎么办 没有土地的农民怎么办 手机屁股坏了怎么办 包颈手术后睡中会勃起怎么办 武警义务兵训练不合格怎么办 空姐体检心率不齐怎么办 空姐体检差身高怎么办 锻炼过猛肌肉疼怎么办 中考体检有问题怎么办 想参军视力不够怎么办 公司体检查出乙肝怎么办 乙肝携带者福利体检怎么办 小孩没考好我该怎么办 客户考虑我该怎么办 明天中考 我该怎么办 考试考差了怎么办 没考上理想高中怎么办 我是差学生中考怎么办 衬衫后背鼓起来怎么办 高考体检表没了怎么办 高考体检视力不合格怎么办 高考体检转氨酶高怎么办 高考体检肝功能异常怎么办 高考体检有乙肝怎么办 高考体检有纹身怎么办 学校体检血压高怎么办 高考体检不属实怎么办 艺考身上有花臂怎么办 义务兵因病致残怎么办 新兵练成绩优秀怎么办 阿提拉部队得了瘟疫怎么办 公安体能测评胖子怎么办 社区工作者笔试不及格怎么办