找到元素只是“看见”,剑客的下一课是“出手”——读它写它、改它的属性。 这一式修炼读与写的基本功:内容与属性,招招到肉。
- 会用
text()、html()、val()读写内容,分清三者分工 - 会用
attr()读写、removeAttr()删除,明白prop()与attr()的分工 - 掌握带回调的写法
function (index, oldValue),并继续强化链式调用
text 与 html:往元素里写内容
text() 与 html() 都能读能写,差别在于对标签的态度:
text() 是老实人,写进去的标签会被当作普通文字原样显示;
html() 是手艺人,会真的把标签解析成元素。
—— 结果区 ——
点“用 text() 写”,页面显示的是带着尖括号的 <em>青山不改</em>——标签成了文字;
点“用 html() 写”,绿水长流以斜体登场——标签成了结构。html() 还能一次写进整段结构,
比如 $('#jq03-out').html('<strong>加粗</strong> 的句子')。
html() 会真的执行标签。如果写进去的内容来自用户的输入,就可能被塞进恶意脚本
(江湖称 XSS)。规则简单:内容里有用户输入、且只是纯文字时,一律用 text()。
val:表单控件的专用通道
输入框、下拉框、文本域里的值不走 text(),走 val()——它是表单控件的专用通道。
无参是读,带参是写。
(还没有内容)
每次松开按键(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 不可。
prop('disabled', true) 让按钮立刻灰掉,false 让它复活。
口诀:布尔状态用 prop,普通字面量用 attr。
带回调的写法
text()、html()、val()、attr() 写值时都接受一个回调函数
function (index, oldValue)——index 是元素在集合里的位置(从 0 起),oldValue 是它原来的内容;
函数返回什么,就写成什么。适合“按位置定制”。
起手式
快剑式
收剑式
回调让“读旧值 → 算新值 → 写回”一步到位。再配上链式调用——每个方法都返回集合本身, 链子就能一直串下去,编号、染色一气呵成,写代码像写一句话。
- 改造例 2:把“你说的是:xxx”改成“已输入 N 个字”,用
val().length统计字数。 - 用回调写法,给例 4 的三个招式名后面追加“(练成)”二字。
- 思考题:为什么“是否勾选”要用
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(),让页面在鼠标起落之间改头换面。