重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
jQuery 选择器简介
创新互联自2013年创立以来,先为十堰郧阳等服务建站,十堰郧阳等地企业,进行企业商务咨询服务。为十堰郧阳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
jQuery 选择器允许对 HTML 元素组或单个元素进行操作。
jQuery 选择器基于元素的 id、类、类型、属性、属性值等"查找"(或选择)HTML 元素。 它基于已经存在的 CSS 选择器,除此之外,它还有一些自定义的选择器。
jQuery 中所有选择器都以美元符号开头:$()。
1 .基本选择器
$("#test") 选择id值为test的元素,id值是唯一的所以返回单个元素。
$("div") 选择所有的div标签元素,返回div元素数组
$(".myclass") 选择使用myclass类的css的所有元素
$("*") 选取所有元素。
$("#test,div,.myclass") 选取多个元素。
2.层次选择器
$("div span") 选取div里的所有span元素
$("div span") 选取div元素下元素名是span的子元素
$("#one +div") 选取id为one的元素的下一个div同辈元素 等同于$("#one").next("div")
$("#one~div") 选取id为one的元素的元素后面的所有div同辈元素 等同于$("#one").nextAll("div")
$("#one").siblings("div") 获取id为one的元素的所有div同辈元素(不管前后)
$("#one").prev("div") 获取id为one的元素的前面紧邻的同辈div元素
所以 获取元素范围大小顺序依次为:
$("#one").siblings("div")$("#one~div")$("#one +div")
或是
$("#one").siblings("div")$("#one").nextAll("div")$("#one").next("div")
3.基本过滤选择器
$("div:first") 选取所有div元素中第1个div元素
$("div:last") 选取所有div元素中最后一个div元素
$("input:not(.myClass)") 选取class不是myClass的input元素
$("input:even") 选取索引是偶数的input元素(索引从0开始)
$("input:odd") 选取索引是基数的input元素(索引从0开始)
$("input:eq(2)") 选取索引等于2的input元素
$("input:gt(4)") 选取索引大于4的input元素
$("input:lt(4)") 选取索引小于4的input元素
$(":header") 过滤掉所有标题元素,例如:h1、h2、h3等
$("div:animated") 选取正在执行动画的div元素
$(":focus") 选取当前获取焦点的元素
4.内容过滤选择器
$("div:contains('Name')") 选取所有div中含有'Name'文本的元素
$("div:empty") 选取不包含子元素(包括文本元素)的div空元素
$("div:has(p)") 选取所有含有p元素的div元素
$("div:parent") 选取拥有子元素的(包括文本元素)div元素
5.可见性过滤选择器
$("div:hidden") 选取所有不可见的div元素
$("div:visible") 选取所有可见的div元素
6.属性过滤选择器
$("div[id]") 选取所有拥有属性id的元素
$("input[name='test']") 选取所有的name属性等于'test'的input元素
$("input[name!='test']") 选取所有的name属性不等于'test'的input元素
$("input[name^='news']") 选取所有的name属性以'news'开头的input元素
$("input[name$='news']") 选取所有的name属性以'news'结尾的input元素
$("input[name*='news']") 选取所有的name属性包含'news'的input元素
$("div[title|='en']") 选取属性title等于'en'或以'en'为前缀(该字符串后跟一个连字符'-')的div元素
$("div[title~='en']") 选取属性title用空格分隔的值中包含字符en的div元素
$("div[id][title$='test']") 选取拥有属性id,并且属性title以'test'结束的div元素
7.子元素过滤选择器
$("div .one:nth-child(2)") 选取class为'one'的div父元素下的第2个子元素
$("div span:first-child") 选取每个div中的第1个span元素
$("div span:last-child") 选取每个div中的最后一个span元素
$("div button:only-child") 在div中选取是唯一子元素的button元素
8.表单对象属性过滤选择器
$("#form1 :enabled") 选取id为'form1'的表单内所有可用元素
$("#form2 :disabled") 选取id为'form2'的表单内所有不可用元素
$("input :checked") 选取所有被选中的input元素
$("select option:selected") 选取所有的select 的子元素中被选中的元素
9.表单选择器
$(":input") 选取所有input,textarea,select 和 button元素
$(":text") 选取所有的单行文本框
$(":password") 选取所有的密码框
$(":radio") 选取所有单的选框
$(":checkbox") 选取所有的多选框
$(":submit") 选取所有的提交按钮
$(":image") 选取所有的图像按钮
$(":reset") 选取所有的重置按钮
$(":button") 选取所有的按钮
$(":file") 选取所有的上传域
$(":hidden") 选取所有不可见元素
已经测试#36;('#div1,#div2').attr('class','waring');
是正确的
还有一种就是多个DIV你可以给他们加一些无用的属性比如:
div id="div1" title="haha"/divdiv id="div2" title="haha"/divdiv id="div3" title="haha"/div#36;("div [titile=haha]").attr('class','waring');
在HTML页面引入jQuery文件
!-- 1. 引入jQuery文件 --
script src="jquery-1.11.3.js"/script
在HTML页面定义元素
!-- 定义HTML页面元素 --
input type="text" value="请输入你的用户名" id="username"
使用jQuery的选择器定位元素
// 2. 使用jQuery选择器定位HTML页面元素
var $username = $("#username");
jQuery选择器是jQuery库中非常重要的部分之一。它支持网页开发者所熟知的CSS语法快速轻松地对页面进行设置。了解jQuery选择器是打开高效开发jQuery之门的钥匙。一个典型的jQuery选择器句法形式:
$(selector).methodName();
selector是一个字符串表达示,用于识别DOM中的元素,然后使用jQuery提供的方法集合加以设置。
大多数情况下jQuery支持这样的操作:
$(selector).method1().method2().method3();
这个实例表示隐含DOM中id=”goAway”的元素,然后为其添加一个class=”incognito”属性。
$(’#goAway’).hide().addClass(’incognito’);
提示一下:当选择器表达示匹配多个元素时,可以象JavaScritp数组操作一样,方便灵活地利用数组指针进行选取。这是例子:
var element = $(’img’)[0];
匹配表达示的元素中,第一个元素对象将赋给变量element。
jQuery选择器的分类
有三种分类:基本选择器,位置选择器和自定义选择器。可以将基本选择器理解为“发现型选择器”,事实上它用于搜索DOM中的元素。位置选择器和自定义选择器更像是“筛选型选择器”。
基本选择器
这里提供了一份基本选择器的参考实例。这些选择器都支持CSS3语法准标和语议。
$(‘div’) 选取所有div元素。
$(‘fieldset a’) 选择在fieldset元素内出现的所有a元素。
$(‘lip’) 选取在li标记中直接出现的所有p元素。
$(‘div~p’) 选取位为div标记之后出现的所有p元素。
$(‘p:has(b)’) 选取p元素内包含有b的所有元素。
$(‘div.someClass’) 选取div元素中出现class=”someClass”属性的所有元素。
$(‘.someClass’) 选取出现class=”someClass”属性的所有元素。
$(‘#testButton’) 选取id=”testButton”的元素。元素id属性值在当前DOM中是唯一的。因此我很好奇出现了两个id=”testButton”的元素时它会 怎么选。实验证明它只会选取第一个元素。真正的开发过程中,我们绝对不要在一个DOM中出现多个id相同的元素。
$(‘img[alt]’) 选取具有alt属性的所有img元素。
$(‘a[href$=.pdf]’) 选取具有href属性,而且属性的值以.pdf结尾的所有a元素。
$(‘button[id*=test]’) 选取所有的按钮,但按钮的id属性要包含”test”。
提示一下:在同一个$()结构中可以用“,”来连接多个不同的选择器,比如这样:
$(’div,p’)
以下是匹配所有具有title属性的div元素,和所有具有alt属性的img元素:
$(’div[title],img[alt]‘)
位置选择器
这种类型的选择器可以附加到任何基本选择器上,用于进行基于元素位置的筛选。如果缺省基本选择器,则将被视为所有元素。
举一些例子吧。
$(’p:first’) 选取页面中第一个出现的p元素。
$(’img[src$=.png]:first’) 选取页面中第一个出现src属性值以.png结尾的img元素。
$(’button.small:last’) 选取页面中最后一个出现class=”small”的按钮元素。
$(’li:first-child’) 选取页面中所有li列表的第一项元素。
$(’a:only-child’) 选取页面中所有a元素,但这些元素只能位于一个父级元素内。比如lia href=”url”An url/a/li,此时li内的a是匹配的。
$(‘li:nth-child(2)’) 选取父级元素中第二个li元素。li也一家要位于一个父级元素内。比如ul
li1/li
li2/li
/ul
此时li2/li是匹配的。
$(’tr:nth-child(odd)’) 选取表格中所有为奇数的行元素。
$(‘li:nth-child(3n)’) 在父级元素中有很多个li元素,但只选取隔3次出现的li元素。比如
ul
li1/li
li2/li
li3/li
li4/li
li5/li
li6/li
li7/li
li8/li
/ul
其中li3/li,li6/li匹配。
$(’li:nth-child(3n+5)’) 带有偏移量的选取。在父级元素中只选取从第5个li元素开始每隔3次出现的li元素。比如
ul
li1/li
li2/li
li3/li
li4/li
li5/li
li6/li
li7/li
li8/li
/ul
其中li5/li,li8/li匹配。
$(‘.someClass:eq(1)’) 选取页面中class=”someClass”的第二个元素。jQuery以0为基准,因此(1)表示相当于第2个。
$(‘.someClass:gt(1)’) 选取页面中所有class=”someClass”的元素,除了开头两个。
$(‘.someClass:lt(4)’) 只选取页面中所有class=”someClass”元素中最先的4个元素。
自定义选择器
jQuery提供这类的选择器用于在并不期望有CSS明确规定时,对元素进行方便快捷地选取。自定义选择器有可能会被组合起来,来看一看这些强大的选择器实例。
$(’img:animated’) 选取所有刚刚经历完动画方法调用的img元素。
$(’:button:hidden’) 选取所有被hide()方法隐含的按钮类型元素。
$(’input[name=myRadioGroup]:radio:checked’)选取name=”myRadioGroup”的单选框内被选中的项目。
$(’:text:disabled’) 选取所有被禁用的文本框元素。
$(’#xyz :header’) 选取id=”xyz”元素内的所有h元素。
$(’option:not(:selected)’) 选取没有被选中的所有的option元素。
$(’#myForm button:not(.someClass)’) 选取id=”myForm”的表单内不具有class=”someClass”属性的所有按钮。
$(’select[name=choices] :selected’) 选取name=”choices”的select元素中所有被选中的option项。
$(’p:contains(coffee)’) 选取所有内容包含有coffee的p元素。
无论是单一的或是组合,jQuery选择器能创建强大而简便的一套方案,便于jQuery内置的一些方法地行极富想像力的WEB开发。
每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init
对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为js的prototype对象可
以实现继承,加上js的对象只是引用不会是拷贝,new
jQuery,new
jQuery.fn和new
jQuery.fn.init的子对象是一样的,只是有没有执行到init的不同,这里就不讲原因了,等下一篇再讲为什么会是这样。
当我们使用选择器的时候$(selector,content),就会执行
init(selectot,content),我们看看inti中是怎样执行的:
复制代码
代码如下:
if
(
typeof
selector
==
"string"
)
{
//正则匹配,看是不是HTML代码或者是#id
var
match
=
quickExpr.exec(
selector
);
//没有作为待查找的
DOM
元素集、文档或
jQuery
对象。
//selector是#id的形式
if
(
match
(match[1]
||
!context)
)
{
//
HANDLE:
$(html)
-
$(array)
//HTML代码,调用clean补全HTML代码
if
(
match[1]
){
selector
=
jQuery.clean(
[
match[1]
],
context
);
}
//
是:
$("#id")
else
{
//判断id的Dom是不是加载完成
var
elem
=
document.getElementById(
match[3]
);
if
(
elem
){
if
(
elem.id
!=
match[3]
)
return
jQuery().find(
selector
);
return
jQuery(
elem
);//执行完毕return
}
selector
=
[];
}
//非id的形式.在context中或者是全文查找
}
else{
return
jQuery(
context
).find(
selector
);
}
}
这里就说明只有选择器写成$(‘#id')的时候最快,相当于执行了一次
getElementById,后边的程序就不用再执行了。当然往往我们需要的选择器并不是这么简单,比如我们需要id下的CSS为className,
有这样的写法$(‘#id.className')和$(‘#id').find(‘.className');这两种写法的执行结果都是一样的,比
如div
id=”id”span
class=”className”/span/div,返回的肯定都是span
class=”className”/span,但是执行的效率是完全不一样的。
在分析一下上边的代码,如果不是$(‘#id')这样的简单选择器的话,都会执行find函
数,那我们再看看find到底是做用的:
复制代码
代码如下:
find:
function(
selector
)
{
//在当前的对象中查找
var
elems
=
jQuery.map(this,
function(elem){
return
jQuery.find(
selector,
elem
);
});
//下边的代码可以忽略,只是做一些处理
//这里应用了js的正则对象的静态方法test
//indexOf("..")需要了解一下xpath的语法,就是判断selector中包含父节点的写法
//本意就是过滤数组的重复元素
return
this.pushStack(
/[^+]
[^+]/.test(
selector
)
||
selector.indexOf("..")
-1
?
jQuery.unique(
elems
)
:
elems
);
}
如果这样写$(‘#id
.className'),就会执行到扩展的find(‘#id
.className',document),因为当前的this是document的jQuery数组,那我们在看看扩展的find他的实现,代码比较
多,就不列出来,总之就是从第二个参数传递进行的dom第一个子节点开始找,遇见#比对id,遇见.比对ClassName,还有:+-等处理。
那我们要优化,是不是就要想办法让第二个参数context的范围最小,那样遍历是不是就很少了?
如果我们这样写$(‘#id').find(‘.className'),那程序只这样执行
的,第一次init的时候执行一步getElementById,就return了,接着执行
find(‘.className',divDocument),divDocument就是我们第一次选择的是div标签,如果document下有很
多dom对象的时候,这次只遍历divDocument是不是少了很多次,而且在第一次选择id的速度也要比遍历快的多。
现在大家应该是明白了吧。就是说第一层选择最好是ID,而是简单选择器,目的就是定义范围,
提高速度,这次就说这些,选择写法的优化,其他的优化,下次再说。
1、基本选择器:
#id 、element 、.class 、* 、selector1,selector2,selectorN
2、层次选择器:
ancestor descendant 、parent child 、prev + next 、prev ~ siblings
3、基本过滤器选择器
:first 、:last 、:not 、:even 、:odd 、:eq 、:gt 、:lt 、:header 、
:animated
4、内容过滤器选择器
:contains 、:empty 、:has 、:parent
5、可见性过滤器选择器
:hidden 、:visible
6、属性过滤器选择器
[attribute] 、[attribute=value] 、[attribute!=value] 、[attribute^=value] 、[attribute$=value] 、[attribute*=value] 、[attrSel1][attrSel2][attrSelN]
7、子元素过滤器选择器
:nth-child 、:first-child 、:last-child 、:only-child
8、表单选择器
:input 、:text 、:password 、:radio 、:checkbox 、:submit 、:image 、:reset 、:button
、:file 、:hidden
9、表单过滤器选择器
:enabled 、:disabled 、:checked 、:selected
其实jQuery选择器就只有一种$()函数或jQuery()函数,$只是jQuery的缩写。$("")的引号中,以点开头,说明是选择Class。以井号开始,说明是选择ID,直接写入标签,则证明是选择指定的元素。最主要就是筛选器。比如:我有个需求,在表格中每隔一行设置一个背景色。怎么办?就可以这样$("tr:odd").css("background-color","#f00"); 筛选器,就是在选择器之后加冒号。odd是选择 选择器中索引为奇数(也就是偶数行)。其实更多的筛选器我这也没办法说清楚,你可以下载jQuery的API帮助文档,里面的目录中有专门的筛选器介绍,所有的筛选器和选择器在里面都有介绍