升級 jQuery 1.6+ 後,原本 $('#cb').attr('checked') 返回 true/false,現返回 "checked"(字符串)或 undefined,導致邏輯判斷失效。
jQuery 1.6 明確區分了 Attributes(屬性) 與 Properties(特性):
| 概念 | 例子 | jQuery 方法 |
|---|---|---|
| Attribute | id、name、type、HTML 中寫死的 checked | .attr() |
| Property | checked 當前狀態、selectedIndex、disabled、value | .prop() (1.6+) |
checked attribute:HTML 初始值,不隨用戶操作變化。checked property:實時反映勾選狀態,隨交互即時更新。// ❌ jQuery 1.6+ 錯誤用法
var checked = $('#cb').attr('checked'); // "checked" 或 undefined
$('#cb').attr('checked', true); // 僅修改 attribute,不改變 UI 狀態
// ✅ 推薦:使用 .prop()
var checked = $('#cb').prop('checked'); // true / false
$('#cb').prop('checked', true); // 正確修改勾選狀態
// ✅ 替代:使用 .is()
var checked = $('#cb').is(':checked'); // true / false
| HTML Attribute | DOM Property | 備註 |
|---|---|---|
value | value | 輸入框當前值用 .val() 或 .prop('value') |
selected | selected | option 元素 |
disabled | disabled | 表單元素 |
readonly | readOnly | 大小寫差異 |
class | className | 用 .addClass/.removeClass/.toggleClass |
style | style | 用 .css() |
\.attr\(['\"]checked['\"]\) → 替換為 .prop('checked')。\.attr\(['\"]disabled['\"]\)、selected、readonly 等布爾屬性,同理改用 .prop()。.attr() 僅用於:id、name、href、src、data-*、role、aria-* 等真正的 HTML 屬性。jQuery 1.6 的屬性/特性分離符合 DOM 標準,雖造成遷移痛點,但讓代碼語義更清晰:用 .prop() 操作動態狀態,用 .attr() 操作靜態屬性。養成這一習慣,未來升級將無痛。