jQuery选择器详解


根据获取页面中的元素的不同,jQuery选择器可以分为:

目录 (Table of Contents)

基本选择器

由元素id, class, 元素名, 多个选择符组成,通过基本选择器可以实现大多数页面元素的查找。

例:

  1. <script>
  2. $(function(){ //ID选择器
  3. $("#divOne").css("display","block");
  4. })
  5. $(function(){ //元素名匹配元素
  6. $("div span").css("display","block");
  7. })
  8. $(function(){ //类名匹配元素
  9. $(".clsFrame .clsOne").css("display","block");
  10. })
  11. $(function(){ //匹配所有元素
  12. $("*").css("display","block");
  13. })
  14. $(function(){ //合并匹配元素
  15. $("#divOne,span").css("display","block");
  16. })
  17. </script>
  1. <body>
  2. <div class='clsFrame'>
  3. <div id='divOne'>ID</div>
  4. <div class='clsOne'>CLASS</div>
  5. <span>SPAN</span>
  6. </div>
  7. </body>

层次选择器

层次选择器通过DOM元素间的层次关系获取元素,其主要的层次关系包括后代,父子,相邻,兄弟,通过其中某类关系可以方便快捷的定位元素。

  1. 层次选择器语法:
  2. ancestor descendant 根据祖先元素匹配所有的后代元素
  3. parent > child 根据父元素匹配所有的子元素
  4. prev + next 匹配所有紧接在prev元素后的'相邻'元素
  5. prev ~ sibling 匹配prev元素之后的'所有'兄弟元素
  6. siblings() 获取相邻的元素
  7. .parent() 获取父元素(只获取相邻的上一层父元素)

注:ancestor descendant与parent > child所选择的元数据是不同的

  1. parent > child选择的是 parent 后的所有子元素不包括孙子元素或更深的元素。
  2. ancestor descendant所选择的是所有的子元素包括子元素和更深的元素。前者的层次关系是祖先与后代,后者的关系是父子关系;

另外, prev + next 可以用 prev.next()代替。
而 prev ~ sibling 可以用 prev.nextAll()代替。

  1. <script type="text/javascript">
  2. $(function(){ //匹配后代元素
  3. $("#divMid").css("display","block");
  4. $("div span").css("display","block");
  5. })
  6. $(function(){ //匹配子元素
  7. $("#divMid").css("display","block");
  8. $("div > span").css("display","block");
  9. })
  10. $(function(){ //匹配下一个元素
  11. $("#divMid + div").css("display","block");
  12. $("#divMid").next().css("display","block");
  13. })
  14. $(function(){ //匹配后面的所有兄弟元素
  15. $("#divMid ~ div").css("display","block");
  16. $("#divMid").nextAll().css("display","block");
  17. })
  18. $(function(){ //匹配所有相邻元素
  19. $("#divMid").siblings("div").css("display","block");
  20. })
  21. $(function(){ //匹配后面的所有兄弟元素的另一种写法
  22. $("#divMid").nextAll().css("display","block");
  23. })
  24. $(function(){ //匹配父元素下同级元素
  25. $(this).parent().child().find("td#f").text()
  26. })
  27. </script>

注:sibings() 写法与与选择器 prev ~ sibling 的区别是:前者获取所有相邻的元素,不分前后。后者获取所有后面相邻的元素,不获取前面的元素。

简单过滤选择器

  1. <script type="text/javascript">
  2. $(function(){ //为第一个li增加样式
  3. $("li:first").addClass("GetFocus");
  4. });
  5. $(function(){ //为最后一个li增加样式
  6. $("li:last").addClass("GetFocus");
  7. });
  8. $(function(){ //未排除指定的元素后的所有指定元素增加样式
  9. $("li:not(.NotClass)").addClass("GetFocus");
  10. });
  11. $(function(){ //为指定元素索引值为偶数的的元素增加样式,从0开始计数
  12. $("li:even").addClass("GetFocus");
  13. });
  14. $(function(){ //为指定元素索值为奇数的元素增加样式,从0开始计数
  15. $("li:odd").addClass("GetFocus");
  16. });
  17. $(function(){ //为一个指定索引值的元素增加样式,从0开始计数
  18. $("li:eq(1)").addClass("GetFocus");
  19. });
  20. $(function(){ //为所有大于给定索引值的元素增加样式,从0开始计数
  21. $("li:gt(1)").addClass("GetFocus");
  22. });
  23. $(function(){ //为所有小于给定索引的元素增加样式, 从0开始计数
  24. $("li:lt(2)").addClass("GetFocus");
  25. });
  26. $(function(){ //增加标题类元素类别
  27. $("div h1").css("width","238px");
  28. $(":header").addClass("GetFocus");
  29. });
  30. $(function(){
  31. animateIt(); //增加动画效果元素类别
  32. $("#spnMove:animated").addClass("GetFocus");
  33. });
  34. function animateIt() { //动画效果
  35. $("#spnMove").slideToggle("slow", animateIt);
  36. }
  37. </script>
  38. ....
  39. <body>
  40. <div>
  41. <h1>基本过滤选择器</h1>
  42. <ul>
  43. <li class="DefClass">Item 0</li>
  44. <li class="DefClass">Item 1</li>
  45. <li class="NotClass">Item 2</li>
  46. <li class="DefClass">Item 3</li>
  47. </ul>
  48. <span id="spnMove">Span Move</span>
  49. </div>
  50. </body>
  51. ....

内容过滤选择器

内容过滤选择器根据元素中的文字内容或所包含的子元素特征获取元素,文字内容可以模糊或绝对匹配进行元素匹配。
:contains(text) 获取包含给定文本的元素
:empty 不包含子元素或文字内容的空元素
:has(selector) 获取包含有选择器所匹配的元素的元素
:parent 获取含有子元素或文本的元素
例:

  1. ...
  2. <script type="text/javascript">
  3. $(function(){ //显示包含给定文本的元素
  4. $("div:contains('A')").css("display","block");
  5. });
  6. $(function(){ //显示不包含文本或子元素的元素
  7. $("div:empty").css("display","block");
  8. });
  9. $(function(){ //显示包含给定元素的元素
  10. $("div:has(span)").css("display","block");
  11. });
  12. $(function(){ //显示包含有子元素或文本的元素
  13. $("div:parent").css("display","block");
  14. });
  15. </script>
  16. ...
  17. <body>
  18. <div>ABCD</div>
  19. <div><span></span></div>
  20. <div>EFah</div>
  21. <div></div>
  22. </body>
  23. ...

可见性过滤选择器

根据元素是否可见的特征获取元素。
:hidden 获取所有不可见元素,或者type为hidden的元素
:visible 获取所有的课件元素

  1. <script type="text/javascript">
  2. $(function(){ //增加所有可见元素类别
  3. $("div:visible").addClass("GetFocus");
  4. $("span:hidden").show();
  5. })
  6. $(function(){ //增加所有不可见元素类别
  7. $("span:hidden").show().addClass("GetFocus");
  8. })
  9. </script>
  10. ...
  11. <body>
  12. <span style="display:none">hidden</span>
  13. <div>visible</div>
  14. </body>

[注]: 冒号前后不可加入空格,否则将产生不同的语法意义。

属性过滤选择器

根据元素的某个属性获取元素
[attribute] 获取给定属性的元素
[attribute = value] 获取等于给定元素的属性是某个特定的值
[attribute != value] 获取不等于给定元素的属性是某个特定的值的元素
[attribute ^= value] 获取给定元素的属性是以某个特定的值开始的元素
[attribute $= value] 获取给定元素的属性是以某个特定的值结束的元素
[attribute *= value] 获取给定元素的属性包含某个特定的值的元素
[selector1][selector2][selectorN] 获取满足多个给定条件的复合属性的元素

  1. <script type="text/javascript">
  2. $(function(){ //显示所有包含属性id的div
  3. $("div[id]").show(3000);
  4. })
  5. $(function(){ //显示所有title值是A的div
  6. $("div[title='A']").show(3000);
  7. })
  8. $(function(){ //显示所有title值不是A的div
  9. $("div[title!='A']").show(3000);
  10. })
  11. $(function(){ //显示所有title值以A开始的div
  12. $("div[title^='A']").show(3000);
  13. })
  14. $(function(){ //显示所有title值以C结尾的div
  15. $("div[title$='C']").show(3000);
  16. })
  17. $(function(){ //显示所有title值中包含字母B的div
  18. $("div[title*='B']").show(3000);
  19. })
  20. $(function(){ //显示所有title值中包含有'B' 并且id = divAB 的div
  21. $("div[id='divAB'][title*='B']").show(3000);
  22. })
  23. </script>

子元素过滤选择器

突出指定某行
:nth-child(eq|even|odd|index) 获取每个父元素下特定位置的元素,索引号从1开始
:first-child 获取每个父元素下的第一个子元素
:last-child 获取每个父元素下最后一个子元素
:only-child 获取每个父元素下的仅有的一个子元素

例:

  1. ...
  2. <script type="text/javascript">
  3. $(function(){ //增加每个父元素下第2个子元素类别
  4. $("li:nth-child(2)").addClass("GetFocus");
  5. });
  6. $(function(){ //增加每个父元素下第1个子元素类别
  7. $("li:first-child").addClass("GetFocus");
  8. });
  9. $(function(){ //增加每个父元素下最后一个子元素类别
  10. $("li:last-child").addClass("GetFocus");
  11. });
  12. $(function(){ //增加每个父元素下只有一个子元素的类别
  13. $("li:only-child").addClass("GetFocus");
  14. });
  15. </script>
  16. ...

表单对象属性选择器

  1. :enabled 获取表单中所有属性为可用元素的元素
  2. :displayed 获取表单中所有属性为不可用的元素
  3. :checked 获取表单中所有被选中的元素
  4. :selected 获取表单中所有被选中的option元素

例:

  1. <script type="text/javascript">
  2. $(function(){ //增加所选元素为可用的元素类别
  3. $("#divA").show(3000);
  4. $("#form1 input:enabled").addClass("GetFocus");
  5. })
  6. $(function(){ //增加所选元素为不可用的元素类别
  7. $("#divA").show(3000);
  8. $("#form1 input:disabled").addClass("GetFocus");
  9. })
  10. $(function(){ //增加所选元素被选中的元素类别
  11. $("#divB").show(3000);
  12. $("#form1 input:checked").addClass("GetFocus");
  13. })
  14. $(function(){ //显示表单中所有option被选中的元素内容
  15. $("#divC").show(3000);
  16. $("#Span2").html("选中项是:" + $("select option:selected").text());
  17. })
  18. </script>

表单选择器

表单选择器语法:
:input 获取所有input,textear,select
:text 获取所有text
:password 获取所有password
:radio 获取所有radio
:checkbox 获取所有checkbox
:submit 获取所有submit
:image 获取所有图像域
:reset 获取所有reset
:button 获取所有button
:file 获取所有file

例:

  1. <script type="text/javascript">
  2. $(function(){ //增加所选元素为可用的元素类别
  3. $("#form1 :text").show(3000);
  4. })
  5. </script>

拓展

JS获取节点的兄弟,父级,子级元素 .

先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。

JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素

  1. <div id="test">
  2. <div></div>
  3. <div></div>
  4. </div>

原生的JS获取ID为test的元素下的子元素。可以用:

var a = docuemnt.getElementById("test").getElementsByTagName("div"); 这样是没有问题的
此时a.length=2;但是如果我们换另一种方法
var b =document.getElementById("test").childNodes;
此时b.length 在IE浏览器中没问题,其依旧等于2,但是在FF浏览器中则会使4,是因为FF把换行也当做一个元素了。
所以,在此,我们就要做处理了,需遍历这些元素,把元素类型为空格而且是文本都删除。

  1. function del_ff(elem) {
  2. var elem_child = elem.childNodes;
  3. for (var i = 0; i < elem_child.length; i++) {
  4. if (elem_child[i].nodeName == "#text" && !/\s/.test(elem_child.nodeValue)) {
  5. elem.removeChild(elem_child);
  6. }
  7. }
  8. }

上述函数遍历子元素,当元素里面有节点类型是文本并且文本类型节点的节点值是空的。就把他删除。
nodeNames可以得到一个节点的节点类型,/\s/是非空字符在JS里的正则表达式。前面加!,则表示是空字符
test() 方法用于检测一个字符串是否匹配某个模式.语法是: RegExpObject.test(string)
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
nodeValue表示得到这个节点里的值。
removeChild则是删除元素的子元素。
之后,在调用子,父,兄,这些属性之前,调用上面的函数把空格清理一下就可以了

  1. <div id="test">
  2. <div></div>
  3. <div></div>
  4. </div>
  5. <script>
  6. function dom() {
  7. var s= document.getElementById("test");
  8. del_ff(s); //清理空格
  9. var chils= s.childNodes; //得到s的全部子节点
  10. var par=s.parentNode; //得到s的父节点
  11. var ns=s.nextSbiling; //获得s的下一个兄弟节点
  12. var ps=s.previousSbiling; //得到s的上一个兄弟节点
  13. var fc=s.firstChild; //获得s的第一个子节点
  14. var lc=s.lastChild; //获得s的最后一个子节点
  15. }
  16. </script>

下面介绍JQUERY的父,子,兄弟节点查找方法

jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$(“span”).parent()或者$(“span”).parent(“.class”)

jQuery.parents(expr),类似于jQuery.parents(expr),但是是查找所有祖先元素,不限于父元素

jQuery.children(expr).返回所有子节点,这个方法只会返回直接的孩子节点,不会返回所有的子孙节点

jQuery.contents(),返回下面的所有内容,包括节点和文本。这个方法和children()的区别就在于,包括空白文本,也会被作为一个jQuery对象返回,children()则只会返回节点

jQuery.prev(),返回上一个兄弟节点,不是所有的兄弟节点

jQuery.prevAll(),返回所有之前的兄弟节点

jQuery.next(),返回下一个兄弟节点,不是所有的兄弟节点

jQuery.nextAll(),返回所有之后的兄弟节点

jQuery.siblings(),返回兄弟姐妹节点,不分前后

jQuery.find(expr),跟jQuery.filter(expr)完全不一样。jQuery.filter()是从初始的jQuery对象集合中筛选出一部分,而jQuery.find()的返回结果,不会有初始集合中的内容,比如$(“p”).find(“span”),是从

元素开始找,等同于$(“p span”)

混合选择:jQuery不仅可以自由的选择某种方式来选择指定元素,也可以用多种方式混用来选择指定元素元素:

例:

  1. <select>
  2. <option selected disabled value='1'>a</option>
  3. <option value='1'>aa</option>
  4. <option value='3'>c</option>
  5. <option value='4'>d</option>
  6. </select>
  1. //混合选1:
  2. var del_eles = $("select").find("option:selected:first");
  3. //混合选2:
  4. var recover_option = $("select").find("option[value = '1']:contains('a')");
  5. recover_option.each(function(){
  6. $(this).removeAttr("disabled");
  7. })