找到元素只是“看见”,剑客的下一课是“出手”——读它写它、改它的属性。 这一式修炼读与写的基本功:内容与属性,招招到肉。

本式要点
  • 会用 text()、html()、val() 读写内容,分清三者分工
  • 会用 attr() 读写、removeAttr() 删除,明白 prop() 与 attr() 的分工
  • 掌握带回调的写法 function (index, oldValue),并继续强化链式调用

text 与 html:往元素里写内容

text() 与 html() 都能读能写,差别在于对标签的态度: text() 是老实人,写进去的标签会被当作普通文字原样显示; html() 是手艺人,会真的把标签解析成元素。

例 1 · text 与 html 的态度之差

—— 结果区 ——

点“用 text() 写”,页面显示的是带着尖括号的 <em>青山不改</em>——标签成了文字; 点“用 html() 写”,绿水长流以斜体登场——标签成了结构。html() 还能一次写进整段结构, 比如 $('#jq03-out').html('<strong>加粗</strong> 的句子')。

心法:html() 要小心来历

html() 会真的执行标签。如果写进去的内容来自用户的输入,就可能被塞进恶意脚本 (江湖称 XSS)。规则简单:内容里有用户输入、且只是纯文字时,一律用 text()。

val:表单控件的专用通道

输入框、下拉框、文本域里的值不走 text(),走 val()——它是表单控件的专用通道。 无参是读,带参是写。

例 2 · 输入框即时回显(keyup + val + text)
说点什么

(还没有内容)

每次松开按键(keyup,第五式细讲),先用 val() 读输入框,再用 text() 写进段落。留意分工:谁的值用谁的方法——表单控件用 val(),普通元素用 text() / html()。

attr:读写“看得见”的属性

标签上白纸黑字写着的属性——href、title、alt、data-*—— 归 attr() 管。读、写、删三招:

这里有个通用规矩:jQuery 的“写”方法对集合里每个元素都生效,而“读”方法只取第一个元素的值。 批量改名时省心,读值时别贪多。

prop 与 attr 的分工

有些属性看着像属性,其实是“当下的状态”:checked(勾没勾)、disabled(禁没禁用)、 selected(选没选中)。这类布尔状态该交给 prop()。

为什么?attr() 读的是 HTML 里“写没写”,prop() 读的是元素“当下是什么样”。 一个勾选框,HTML 里写了 checked,用户又把它取消——此时 attr('checked') 仍是 "checked"(HTML 没变),而 prop('checked') 是 false(状态变了)。 想知道“现在勾没勾”,非 prop 不可。

例 3 · 勾选框控制按钮禁用(prop)

prop('disabled', true) 让按钮立刻灰掉,false 让它复活。 口诀:布尔状态用 prop,普通字面量用 attr。

带回调的写法

text()、html()、val()、attr() 写值时都接受一个回调函数 function (index, oldValue)——index 是元素在集合里的位置(从 0 起),oldValue 是它原来的内容; 函数返回什么,就写成什么。适合“按位置定制”。

例 4 · 一键编号(回调 + 链式)

起手式

快剑式

收剑式

回调让“读旧值 → 算新值 → 写回”一步到位。再配上链式调用——每个方法都返回集合本身, 链子就能一直串下去,编号、染色一气呵成,写代码像写一句话。

练功 · 第三式
  1. 改造例 2:把“你说的是:xxx”改成“已输入 N 个字”,用 val().length 统计字数。
  2. 用回调写法,给例 4 的三个招式名后面追加“(练成)”二字。
  3. 思考题:为什么“是否勾选”要用 prop('checked'),而链接地址用 attr('href')?
参考答案 1

val() 返回字符串,.length 是字符串的长度——读到多少字,就报多少字。

参考答案 2

回调里的 old 就是元素当前的内容,拼上新后缀再返回即可。 这次用不到 i,参数照写不误也没关系,但位置不能错——第一个参数永远是 index。

参考答案 3

checked 是“当下状态”——用户一点它就变,而 HTML 源码里写的那个 checked 只是“初始状态”,两者会脱节;attr() 读的是 HTML 字面量,反映不了实时变化。 href 之类则是“静态字面量”,写死在标签里,attr() 正合适。 口诀:动态状态用 prop,静态字面用 attr。

本式小结

  • text() 纯文本、html() 解析标签、val() 专管表单;
  • attr() 读写删除字面属性,布尔状态请交给 prop();
  • 回调写法 function (i, old) 让“按位置定制”成为可能;
  • 链式调用:读、改、写一气呵成。
下一式,修炼类与样式——addClass、toggleClass 与 css(),让页面在鼠标起落之间改头换面。