剑客出剑,先要看得见对手;写 jQuery,先要找到元素。 选择器就是轻剑的眼睛——它与 CSS 选择器几乎一一对应,CSS 练得越熟,这一式练得越快。

本式要点
  • 认识基本选择器:#id、.class、tag 与 *,与 CSS 同源同形
  • 会用组合选择器:tag.class、后代、子代与逗号并集
  • 了解属性选择器与位置选择器,会用 $(selector).length 判断命中数量
  • 认识表单选择器::input、:checked、:selected、:disabled

选择器:轻剑的眼睛

$() 里传入一个选择器字符串,它就会返回一个 jQuery 对象——本质是一个“元素集合”。 哪怕一个元素都没命中,它也不会报错,只是返回一个空集合;反过来,命中多个元素时, 大多数方法会自动对集合里的每一个元素执行,这就是上一式说的“隐式遍历”。

好消息是:这套选择器语法与 CSS 选择器几乎完全一致。你写 CSS 时怎么选元素,jQuery 里就怎么写。基础四式如下:

基本选择器

四个基本选择器里,#id 最快、最准——id 约定全页唯一,选它就等于指名道姓; .class 用于“一批同类”;tag 用于“一整类标签”。 想知道命中了多少,就问集合的 .length。先来数一数段落:

例 1 · 统计段落数

床前明月光,

疑是地上霜。

举头望明月,低头思故乡。

点按钮,看看这一页共有几个段落。

这里有两个小知识点:.length 返回集合里元素的个数,0 就是“一个也没找到”; 而 $('#jq02-demo1 p') 这种“圈定范围再选”的写法,正是接下来要讲的组合选择器。

组合选择器

单一选择器不够精细时,把它们组合起来:紧挨着写是“同时满足”,空格是“后代”, > 是“只认亲儿子”,逗号是“都算”。

.menu a 与 .menu > a 的差别值得咬文嚼字: 后代不问辈分,隔几层都算;子代只认“亲儿子”。下面的演示用并集一次选中两类:

例 2 · 并集选择器批量高亮

手握轻剑,身佩宝刀; 踏遍青山,归来仍是少年。

注意 $('.jian, .dao') 一口气命中了四个词,.css() 也就被自动执行了四次—— 还是那句话:隐式遍历,集合里人人有份。两行 .css() 首尾相连,正是链式调用。

属性选择器

元素身上穿的“属性”也能当线索:[attr] 表示“有这属性就行”, [attr=val] 要求值完全相等,[attr^=val] 要求值以 val 开头。 jQuery 还支持 [attr$=val](结尾)与 [attr*=val](包含)。

例 3 · 只照亮文本框

旁边的数字输入框纹丝不动——[type="text"] 只认文本框。 属性选择器在表单里特别好用:input[required]、input[type="email"] 都是家常便饭。

位置选择器与方法

:first、:last、:even、:odd 按“在集合里的位置”选人。注意 jQuery 从 0 起数,所以 :even 选中的是第 1、3、5……个。

心法:方法比伪类更趁手

这几个位置伪类是 jQuery 的“私房扩展”,不属于标准 CSS。现代 jQuery 更推荐对应的过滤方法: $('li').first()、$('li').eq(2)。理由有二——性能: 浏览器原生不认识 :first 这类伪类,jQuery 得自己多扫一遍;可读性: .first() 一眼就懂,:first 还容易与 CSS 的 :first-child 混淆。 江湖规矩:伪类能用,但方法更体面。

例 4 · 表格隔行变色(:even + css)
位次弟子兵器
1阿青青竹棒
2阿明峨眉刺
3阿直长剑
4阿敏快马

:even 从 0 起数,所以 1、3 行上了色。若改用方法,就是 $('#jq02-demo4 tbody tr').eq(2).css('background-color', '#f4edde') 这类“先广撒网、再精挑”的两步走——这正是第七式(遍历)的主线,此处先打个照面。

表单选择器

表单是网页里最需要“挑挑拣拣”的地方:哪些框填了、哪些勾了、哪些被禁用…… jQuery 为表单备了一组专用伪类,写法上都以冒号开头,可以直接拼在别的选择器后面。

选择器选中谁
:input全部表单控件:input、textarea、select、button 一个不落
:text / :password / :file按 type 挑文本框 / 密码框 / 文件框
:checkbox / :radio / :submit按 type 挑复选框 / 单选按钮 / 提交按钮
:checked被勾选的复选框、单选按钮,以及被选中的下拉项
:selected下拉框里被选中的 <option>
:disabled / :enabled被禁用 / 可用的控件
心法:状态伪类要“现查现用”

勾选、选中、禁用都是实时状态——用户在页面上一点,结果就变了。 所以这类选择器不要只查一次存起来,最好在事件回调里“当下再查一遍”,才能跟上用户的动作。

例 5 · 表单选择器点名
点上面的按钮,看看各选中了几个。
练功 · 第二式
  1. 把例 4 的 :even 改成 :odd,再点一次“隔行上色”,看哪几行变了颜色。
  2. 写一个新页面:四个段落,class="a" 与 class="b" 交替出现;点按钮后 .a 变红、.b 变蓝、全部加粗。
  3. 思考题:为什么 jQuery 官方更推荐 .first() / .eq() 方法,而不是 :first / :eq 伪类?
参考答案 1

变色的是第 2、4 行(阿明、阿敏)——从 0 起数,:odd 对应第 1、3 个位置。 顺手换成方法写法,给“阿直”那一行单独上色:

参考答案 2

前两行是普通 class 选择器,第三行用逗号并集把两类一起加粗—— 三行代码,两类元素,处处都是隐式遍历。

参考答案 3

一是性能:这些伪类不是标准 CSS,浏览器原生选择器不认,jQuery 必须自己实现筛选, 凭空多一道工序;二是可读性:.first() 语义直白,而 :first 容易与 :first-child 等标准伪类混淆。此外,方法形式与 jQuery“先选择、再过滤”的分工一致—— 选择器负责广撒网,过滤方法负责精挑细选。

本式小结

  • jQuery 选择器与 CSS 同源,会 CSS 就掌握了它的大半;
  • 基本、组合、属性、位置、表单五大类选择器,按需取用;
  • $(selector).length 判断命中数量,命中 0 个也不报错;
  • 位置伪类是 jQuery 扩展,江湖上更推崇 .first()、.eq() 等方法;
  • :checked、:disabled 这类状态选择器要“现查现用”,别缓存太久。
下一式,修炼内容与属性——text、html、val 三兄弟轮番登场,attr 与 prop 的恩怨也一并了结。