Skip to content

jQuery 选择器

原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。

基础选择器

js
$("选择器")   //  里面选择器直接写 CSS 选择器即可,但是要加引号
名称用法描述
ID选择器$("#id")获取指定ID的元素
全选选择器$("*")匹配所有元素
类选择器$(".class")获取同一类class的元素
标签选择器$("div")获取同一类标签的所有元素
并集选择器$("div,p,i")选取多个元素
交集选择器$("li.current")交集元素

层级选择器

层级选择器最常用的两个分别为:后代选择器和子代选择器。

名称.用法描述
子代选择器.$("ul>li");使用 > 号,获取亲儿子层级的元素 ; 注意,并不会获取孙子层级的元素
后代选择器$("ul li");使用空格,代表后代选择器,获取ul下的所有li元素,包括孙子等

基础选择器和层级选择器案例代码

html
<div>我是div</div>
<div class="nav">我是nav div</div>
<p>我是p</p>
<ol>
  <li>我是ol 的</li>
  <li>我是ol 的</li>
  <li>我是ol 的</li>
  <li>我是ol 的</li>
</ol>
<ul>
  <li>我是ul 的</li>
  <li>我是ul 的</li>
  <li>我是ul 的</li>
  <li>我是ul 的</li>
</ul>
javascript
$(function () {
  console.log($(".nav"));
  console.log($("ul li"));
});

伪类选择器

筛选选择器,顾名思义就是在所有的选项中选择满足条件的进行筛选选择。常见如下 :

语法用法描述.
:first$(li:first')获取第一个i元素
:last$(li:last')获取最后一个 li 元素
:eq(index)$("li:eq(2)")获取到的 i 元素中,选择索引号为 2 的元素,索引号 index 从 0 开始。
:odd$("li:odd")获取到的 li 元素中,选择索引号为奇数的元素
:even$("li:even")获取到的 li 元素中,选择索引号为偶数的元素

案例代码

html
<ul>
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
  <li>item 4</li>
  <li>item 5</li>
  <li>item 6</li>
</ul>
<ol>
  <li>item 1</li>
  <li>item 2</li>
  <li>item 3</li>
  <li>item 4</li>
  <li>item 5</li>
  <li>item 6</li>
</ol>
javascript
$(function () {
  $("ul li:first").css("color", "red");
  $("ul li:eq(2)").css("color", "blue");
  $("ol li:odd").css("color", "skyblue");
  $("ol li:even").css("color", "pink");
});

另: jQuery 中还有一些筛选方法,类似 DOM 中的通过一个节点找另外一个节点,父、子、兄以外有所加强。

筛选方法

语法用法.说明
parent()$("li").parent()查找父级
children(selector)$("ul").children("li")相当于$("ul>li"),最近一级(亲儿子)
find(selector)$("u1").find("li")相当于$("ul li"),后代选择器
siblings(selector)$(".first").siblings("li")查找兄弟节点,不包括自己本身
nextAll([expr])$(".first").nextAll()查找当前元索之后所有的同辈元素
prevtAll([expr])$(".last").prevAll()查找当前元素之前所有的同辈元素
hasClass(class)$('div').hasClass("protected")检查当前的元素是否含有某个特定的类,如果有,则返回 true
eq(index)$("li").eq(2) 相当于$("li:eq(2)"),index 从 0 开始

筛选方法示例1

html
<div class="yeye">
  <span>爷爷</span>
  <div class="father">
    <span>爸爸</span>
    <div class="son"><span>儿子</span></div>
  </div>
</div>
javascript
// 注意一下都是方法 带括号
$(function () {
  // 1. 父  parent()  返回的是 最近一级的父级元素 亲爸爸
  console.log($(".son").parent().text());

  // 2. 子
  // (1) 亲儿子 children()  类似子代选择器  ul>li
  $(".yeye").children("span").css("color", "red");

  // (2) 可以选里面所有的孩子 包括儿子和孙子  find() 类似于后代选择器
  $(".yeye").find("span").css("color", "red");
});

筛选方法示例 2

html
<ol>
  <li>赵</li>
  <li>钱</li>
  <li class="item">孙</li>
  <li>李</li>
  <li>周</li>
  <li>吴</li>
</ol>
<ul>
  <li>我是 ol 的 li</li>
  <li>我是 ol 的 li</li>
  <li>我是 ol 的 li</li>
  <li>我是 ol 的 li</li>
  <li>我是 ol 的 li</li>
  <li>我是 ol 的 li</li>
</ul>
<div class="current">俺有current</div>
<div>俺木有current</div>
javascript
// 注意一下都是方法 带括号
$(function () {
  // 1. 兄弟元素 siblings 除了自身元素之外的所有亲兄弟
  $("ol .item").siblings("li").css("color", "red");

  // 2. 第 n 个元素
  var index = 2;
  // (1) 我们可以利用选择器的方式选择
  // $("ul li:eq(2)").css("color", "blue");
  $("ul li:eq(" + index + ")").css("color", "blue");

  // (2) 我们可以利用选择方法的方式选择 更推荐这种写法
  // $("ul li").eq(2).css("color", "blue");
  // $("ul li").eq(index).css("color", "blue");

  // 3. 判断是否有某个类名
  console.log($("div:first").hasClass("current"));
  console.log($("div:last").hasClass("current"));
});

隐式迭代

遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。

简单理解:给匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用。

html
<div>惊喜不,意外不</div>
<div>惊喜不,意外不</div>
<div>惊喜不,意外不</div>
<div>惊喜不,意外不</div>
<ul>
  <li>相同的操作</li>
  <li>相同的操作</li>
  <li>相同的操作</li>
</ul>
js
// 1. 获取四个div元素
console.log($("div"));
// 2. 给四个div设置背景颜色为粉色 jquery对象不能使用style
$("div").css("background", "pink");
// 3. 隐式迭代就是把匹配的所有元素内部进行遍历循环,给每一个元素添加css这个方法
$("ul li").css("color", "red");

案例:新浪下拉菜单

参照实现 新浪的下拉菜单

html
<ul class="nav">
  <li>
    <a href="#">博客</a>
    <ul>
      <li><a href="">私信</a></li>
      <li><a href="">评论</a></li>
      <li><a href="">@我</a></li>
    </ul>
  </li>
  <li>
    <a href="#">博客</a>
    <ul>
      <li><a href="">博客评论</a></li>
      <li><a href="">未读提醒</a></li>
    </ul>
  </li>
  <li>
    <a href="#">邮箱</a>
    <ul>
      <li><a href="">免费邮箱</a></li>
      <li><a href="">VIP邮箱</a></li>
      <li><a href="">企业邮箱</a></li>
    </ul>
  </li>
</ul>
html
<style>
    * {margin: 0;padding: 0;}
    li {list-style-type: none;}
    a {text-decoration: none;font-size: 14px;}
    .nav > li {position: relative;float: left;width: 80px;height: 41px;text-align: center;}
    .nav li a {display: block;width: 100%;height: 100%;line-height: 41px;color: #333;}
    .nav > li > a:hover {background-color: #eee;}
    .nav ul {display: none;position: absolute;top: 41px;left: 0;width: 100%;}
    .nav ul li {border-left: 1px solid #FECC5B;border-right: 1px solid #FECC5B;border-bottom: 1px solid #FECC5B;}
    .nav ul li a:hover {background-color: #FFF5DA;}
</style>
javascript
$(function () {
  // 鼠标经过
  $(".nav>li").mouseover(function () {
    // $(this) jQuery 当前元素  this不要加引号
    // show() 显示元素  hide() 隐藏元素
    $(this).children("ul").show();
  });

  // 鼠标离开
  $(".nav>li").mouseout(function () {
    $(this).children("ul").hide();
  });
});

排他思想

当鼠标点击指定的按钮上面时,设置元素背景为粉色

html
<button>按钮 1</button>
<button>按钮 2</button>
<button>按钮 3</button>
<button>按钮 4</button>
<button>按钮 5</button>
<button>按钮 6</button>
<button>按钮 7</button>
js
$(function () {
  // 1. 隐式迭代 给所有的按钮都绑定了点击事件
  $("button").click(function () {
    // 2. 当前的元素变化背景颜色
    $(this).css("background", "pink");
    // 3. 其余的兄弟去掉背景颜色 隐式迭代
    $(this).siblings("button").css("background", "");
  });
});

链式调用

链式调用可以简化元素的连续调用

html
<button>按钮 1</button>
<button>按钮 2</button>
<button>按钮 3</button>
<button>按钮 4</button>
<button>按钮 5</button>
<button>按钮 6</button>
<button>按钮 7</button>
javascript
$(function () {
  // 隐式迭代 给所有的按钮都绑定了点击事件
  $("button").click(function () {
    // 链式编程
    $(this).css("color", "red").siblings().css("color", "");
  });
});