[关闭]
@tsingwong 2016-03-06T03:44:30.000000Z 字数 8181 阅读 738

锋利的jQuery Day2

JavaScript jQuery


jQuery 选择器

1、CSS选择器

选择器 语法 描述 示例
标签选择器 E{
  CSS规则
}
以文档元素作为选择器 td{
font-size:14px;
width:120px;
}
a{
text-decoration:none;
}
ID选择器 #ID{
  CSS规则
}
以文档元素的唯一标识符ID作为选择器 #note{
font-size:14px;
width:120px;
}
类选择器 E.className{
  CSS规则
}
以文档元素的class作为选择符 div.note{
font-size:14px;
}
.dream{
font-size:14px;
}
群组选择器 E1,E2,E3{
  CSS规则
}
多个选择符应用同样的样式规则 td,p,div.a{
font-size:14px;
}
后代选择器 E F{
  CSS规则
}
元素E的任意后代元素F #links a{
color:red;
}
通配选择符 *{
  CSS规则
}
以文档的所有元素作为选择符 *{
font-size:14px;
}

2、jQuery选择器

jQuery选择器完全继承了CSS的风格。学会使用选择器是学习jQuery的基础,jQuery的行为规则都必须在获取到元素后才能生效。

比较CSS和jQuery的写法:

  1. .demo{//给class为demo的元素添加样式
  2. ...
  3. }
  1. $(".demo").click(function(){//给class为demo的元素添加点击行为
  2. ...
  3. })

两者写法十分相似,但作用效果不同。CSS选择器找到元素后是添加样式,jQuery选择器找到元素后是添加行为。

jQuery选择器的优势在于:
1) 简介的写法:$("#ID")用来代替document.getElementById()函数,即通过ID获取元素;$("tagName")用来代替document.getElementsByTagName()函数,即通过标签名获取HTML元素。
2)支持CSS1到CSS3选择器
3)完善的处理机制:

$('#tt')获取的永远是对象,即使网页上没有此元素。因此当要用jQuery检查某个元素在网页中是否存在时,不能使用以下代码:

  1. if($("#tt")){
  2. //do something
  3. }

应该根据获取到的元素的长度来判断,代码如下:

  1. if($("#tt").length > 0){
  2. //do something
  3. }

或者转化成DOM对象来判断:

  1. if($("#tt")[0}){
  2. //do something
  3. }

jQuery选择器分为基本选择器、层次选择器、过滤选择器、表单选择器。

2.1 基本选择器

基本选择器是jQuery中最常用的选择器,通过元素id、class和标签名来查到DOM元素。在网页中,每个id名称只能出现一次,class允许重复使用。

基本选择器

选择器 描述 返回 示例
#id 根据给定的id匹配一个元素 单个元素 $("#test")选取id为test的元素
.class 根据给定的类名匹配元素 集合元素(即数组) $(".test")选取所有class为test的元素
element 根据给定的元素名匹配元素 集合元素 $("p")选取所有的 <p>元素
* 匹配所有元素 集合元素 $("*")选取所有元素
selector1,selector2...selectorN 将每个选择器匹配到的元素合并到一起返回 集合元素 $("div,span,p,myClass")选取所有<div>,<span>和拥有class为myClass的<p>标签的一组元素

可以使用上述的基本选择器完成绝大数的工作。

功能 代码
改变id为one的元素的背景颜色 $("#one")
  .css("background","#bbffaa");
改变class为mini的所有元素的背景色 $(".mini")
  .css("background","#bbffaa");
改变元素名为<div>的所有元素的背景 $("div")
  .css("background","#bbffaa");
改变所有元素的背景色 $("*")
  css("background","#bbffaa");
改变所有的<span>元素和id为two的元素的背景色 $("span,#two")
  .css("background","#bbffaa");
2.2 层次选择器

想通过DOM元素之间的层次关系来获取特定元素,例如后代元素、子元素、相邻元素和同辈元素等。

层次选择器

选择器 描述 返回 示例
$("ancestor descendant") 选取ancestor元素里的所有descendant(后代)元素 集合元素 $("div span")选取<div>里的所有的<span>元素
$("parent>child") 选取parent元素下的child(子)元素,与$("ancestor descendant")有区别,后者选择的是后代元素,前者只选择子元素 集合元素 $("div>span")选取<div>元素下元素名是<span>的子元素
$("prev + next") 选取紧接在prev元素后的next元素 集合元素 $(".one + div")选取class为one的下一个<div>同辈元素
$("prev~siblings") 选取prev元素之后的所有siblings(同辈)元素 集合元素 $("#two~div")选取id为two的元素后面的所有<div>同辈元素

层次选择器的例子如下:

功能 代码
改变<body>内所有<div>的背景色 $("body div")
  .css("background","#bbffaa");
改变<body>内子<div>元素的背景色 $("body > div")
  .css("background","#bbffaa");
改变class为one的下一个<div>同辈元素背景色 $(".one + div")
  .css("background","#bbffaa");
改变id为two的元素后面的所有<div>同辈元素的背景色 $("#two ~ div")
  .css("background","#bbffaa");

其中前两个选择器较为常用,后两个在jQuery中有更为简单的方法取代:
使用next()方法代替$("prev + next")选择器:

$(".one + div");
等价于
$(".one").next("div");

使用nextAll()方法代替$("prev ~ siblings")选择器:

$("#prev ~ div");
等价于
$("#prev").nextAll("div");

siblings()方法与$("prev~div")选择器对比

2.3 过滤选择器

过滤选择器主要是通过特定的过滤规则来筛选出所需的DOM元素,过滤规则与CSS中的伪类选择器语法相同,即选择器都以一个冒号(:)开头。按照不同的过滤规则,过滤选择器分为基本过滤、内容过滤、可见性过滤、属性过滤、子元素过滤和表单对象过滤选择器。

2.3.1 基本属性过滤器
选择器 描述 返回 示例
:first 选取第一个元素 单个元素 $("div:first")选取所有<div>元素中第一个<div>元素
:last 选取最后一个元素 单个元素 $("div:last")选取所有<div>元素中最后一个<div>元素
:not(selector) 去除所有与给定选择器匹配的元素 集合元素 $("div:not(.one)")选取class不为one的<div>元素
:even 选取索引是偶数的所有元素,索引从0开始 集合元素 $("div:even")选取索引值为偶数的<div>元素
:odd 选取索引是奇数的所有元素,索引从0开始 单个元素 $("div:odd")选取索引值为奇数的<div>元素
:eq(index) 选取索引等于index的元素(index从0开始) 单个元素 $("div:eq(3)")选取索引值为3的<div>元素
:gt(index) 选取索引大于index的元素(index从0开始) 集合元素 $("div:ge(3)")选取索引值大于3的<div>元素
:lt(index) 选取索引小于index的元素(index从0开始) 集合元素 $("div:lt(3)")选取索引值小于3的<div>元素
:header 选取所有的标题元素,例如h1,h2,h3等等 集合元素 $(":header")选取所有标题元素,例如<h1>,<h2>,<h3>元素
:animated 选取当前正在执行动画的所有元素 集合元素 $(":animated")选取当前正在执行动画的元素
:focus 选取当前获取焦点的元素 集合元素 $(":focus")选取当前获取交点的元素
2.3.2 内容过滤选择器

内容过滤选择器的过滤规则主要体现在它所包含的子元素或文本内容上。

选择器 描述 返回 示例
:contains(text) 选取含有文本内容为"text"的元素 集合元素 $("div:contains(di)")选取含有文本内容为“di”的<div>元素
:empty 选取不包含子元素或者文本的空元素 集合元素 $("div:empty") 选取不包含子元素(包括文本元素)的<div>空元素
:has(selector) 选取含有选择器所匹配的元素的元素 集合元素 $("div:has('.mini')")选取含有class为mini元素的<div>元素
:parent 选取含有子元素或者文本的元素 集合元素 $("div:parent")选取含有子元素(包括文本元素)的<div>元素
2.3.3 可见性过滤选择器

可见性过滤选择器是根据元素的可见和不可见状态来选择相应的元素。

选择器 描述 返回 示例
:hidden 选取所有不可见的元素 集合元素 $(":hidden")选取所有不可见元素。包括<input type="hidden"/>,<div style="display:none;">和<div style="visibility:hidden;">等元素。如果只想选取<input>元素,可以使用$("input:hidden")
:visible 选取所有可见元素 集合元素 $("div:visible")选取所有可见的<div>元素

其中注意选择器:hidden,它不仅包括样式属性display为“none”的元素,也包括文本隐藏域(<input type="hidden"/>)和visibility:hidden之类的元素。

2.3.4 属性过滤选择器

属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素。

选择器 描述 返回 示例
[attribute] 选取拥有此属性的元素 集合元素 $("div[title]")选取含有属性title的<div>元素
[attribute=value] 选取属性值为value的元素 集合元素 $("div[title=test]")选取属性title等于“test”的<div>元素
[attribute!=value] 选取属性值不等于value的值 集合元素 $("div[title!=test")选取属性title不等于“test”的&<div>元素
[attribute^=value] 选取属性值以value开始的元素 集合元素 $("div[title^=te]")选取属性title值以“te”开始的<div>元素
[attribute$=value] 选取属性值以value结束的元素 集合元素 $("div[title$=est]")选取属性title值以“est”结束的<div>元素
[attribute*=value] 选取属性值含有value的值 集合元素 $("div[title*=es]")选取属性title值中含有“est”的<div>元素
[attribute|=value] 选取属性等于给定字符或以该字符串为前缀(该字符串后跟一个连字符“-”)的元素 集合元素 $("div[title|='en']")选取属性title等于en或以en为前缀(en-)的元素
[attribute~=value] 选取属性用空格分割的值中包含一个给定的元素 集合元素 $("div[title~='uk']")选取属性title用空格分隔的值中包含字符uk的元素
[attribute1][attribute2][attributeN] 用属性选择器合并成一个符合属性选择器,满足多个条件。每选择一次,缩小一次范围 集合元素 $("div[id][title*=es]")选取含有属性id,并且属性title值含有es的<div>元素
2.3.5 子元素过滤选择器

子元素过滤选择器的过滤规则较其他选择器稍微复杂,重点是要将元素的父元素和子元素区分清楚,还要注意它与普通的过滤选择器的区别。

选择器 描述 返回 示例
:nth-child(index/even(偶数)/odd(奇数)/equation) 选取每个父元素下的第index个子元素或者奇偶元素(index从1算起), 集合元素 与:eq(index)区别,:eq(index)只匹配一个元素,index从0开始;而:nth-child将从每一个父元素匹配子元素,其inde是从1开始的
$("div.one nth-child(2)")选取每个class为one的<div>父元素下的第二个子元素,其实也是从0开始算的,只不过0是父元素本身罢了
:first-child 选取每个父元素的第一个子元素 集合元素 与:first区别,:first只返回单个元素,而:first-child将为每个父元素匹配第一个子元素。
$("div.one :first-child")选取每一个class为one的<div>父元素下的第1个子元素
:last-child 选取每个父元素的最后一个子元素 集合元素 与:last区别,:last只返回单个元素,而:last-child选择符将为每个父元素匹配最后一个子元素
$("div.one :last-child")选取每一个class为one的<div>父元素下的最后一个子元素
:only-child 如果某个元素是他父元素中唯一的子元素,则将会被匹配。否则不会被匹配 集合元素 $("div.one :only-child")选取class为one的<div>父元素下只有一个子元素的那个子元素
2.3.6 表单对象属性过滤选择器

表单对象属性过滤器主要对选择的表单元素进行过滤,如选择被选中的下拉框,多选框等元素。

选择器 描述 返回 示例
:enabled 选取所有可用元素 集合元素 $("#form1 input:enabled")获取表单内可用的<input>元素
:disabled 选取所有不可用元素 集合元素 $("#form1 input:disabled")获取表单内不可用的<input>元素
:checked 选取所有被选中的元素(单选框,复选框) 集合元素 $("input :checked")获取多选框选中的元素
:selected 选取所有被选中的选项元素(下拉列表) 集合元素 $("select :selected")获取下拉框选中的元素
2.4 表单选择器

为使用户能够更加灵活地操作表单,jQuery中专门加入表单选择器,能及其方便地获取到表单的某个或某类型的元素。

选择器 描述 返回 示例
:input 选取所有的<input>、<testarea>、<select>和<button>元素 集合元素 $("form1 :input")获取id为form1的表单内的所有表单元素;注意与$("form1 input")区别,后者为层次选择器,作用是获取id为form1表单内的所有<input>元素。
:text 选取所有的单行文本框 集合元素 $("#form1 :text")获取id为form1的表单内的所有单行文本框
:password 获取所有的密码框 集合元素 $("#form1 :password")获取id为form1的表单内的所有密码框
:radio 获取所有的单选框 集合元素 $("#form1 :radio")获取id为form1的表单内的所有单选框
:checkbox 获取所有的多选框 集合元素 $("#form1 :checkbox")获取id为form1的表单内的所有多选框
:submit 获取所有的提交按钮 集合元素 $("#form1 :submit")获取id为form1的表单内的所有提交按钮
:image 获取所有的图像按钮 集合元素 $("#form1 :image")获取id为form1的表单内的所有图像按钮
:reset 获取所有的重置按钮 集合元素 $("#form1 :reset")获取id为form1的表单内的所有重置按钮
:button 获取所有的按钮 集合元素 $("#form1 :button")获取id为form1的表单内的所有按钮
:file 获取所有的上传域 集合元素 $("#form1 :file")获取id为form1的表单内的所有上传域
:hidden 获取所有的不可见元素 集合元素 $("#form1 :hidden")获取id为form1的表单内的所有不可见元素
2.5 选择器注意事项
2.5.1 选择器中含有特殊符号的注意事项

1.含有“·”、“#”、“(”、“)”等特殊字符

根据W3C规定,属性值中不能含有这些特殊字符,但实际项目中偶尔会遇到含有这些特殊字符的情况。解决此类错误的方法就是使用转义符转义。

HTML代码如下:

  1. <div id="id#b">bb</div>
  2. <div id="id[1]>cc</div>

获取元素时应该使用如下写法:

  1. $("#id\\#b"); //转义特殊字符“#”
  2. $("#id\\[1\\]"); //转义特殊字符“[ ]”

2.属性选择器的@符号问题

在jQuery1.3.1版本之后属性选择器选择属性时不需要使用@符号:
以前代码是:

  1. $("div[@title='test']");

正确写法为:

  1. $("div[title='test']");

注:如果项目中使用了较早的jQuery代码和插件,若升级jQuery后,代码报错,其错误来源可能是选择属性器使用了@符号引起的。

2.5.2 选择器中含有空格的注意事项

选择器中的空格也是不容忽视的,多一个空格少一个空格也许会得到截然不同的结果。

  1. $t_a = $(".test :hidden");
  2. $t_b = $(".test:hidden");

之所以造成不同结果,是因为后代选择器和过滤选择器的不同导致的。
带空格的,表示选取class为“test”的元素里面的隐藏元素,即后代选择器。
不带空格的,表示选取隐藏的class为“test”的元素,即过滤选择器。

2.6
  1. $category.show();
  2. //show()显示隐藏的匹配元素
  3. $(this).find("span")
  4. .css("background","url(img/up.gif) no-repeat 0 0")
  5. //css(name,value)给元素设置样式
  6. .text("精简显示品牌");
  7. //text(string)设置所有匹配的元素的文本内容
  8. $("ul li").filter(":contains('佳能'),:contains('尼康'),:contains('奥林巴斯')")
  9. //filtrt(expr)筛选出与指定表达式匹配的元素集合,其中expr可以是多个选择器。要与find()区别find()会在元素内寻找匹配元素,filter()则是筛选元素。一个是对其子集操作,一个是对自身集合元素进行筛选
  10. .addClass("promoted");
  11. //addClass(class)为匹配的元素添加指定的类名
  12. return false;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注