禁用按钮唯一合法方式是设置btn.disabled属性:true禁用、false启用。其他如修改样式或检查disabled属性均不合规;读取div文本需用textContent而非value,推荐+el.textContent||0转换数值。

button.disabled 是唯一合法的禁用方式
用 btn.disabled = true 禁用,用 btn.disabled = false 启用,这是浏览器原生支持、无障碍友好、表单提交行为正确的唯一途径。其他手段全是障眼法:
-
btn.style.opacity = "0.4"或btn.style.pointerEvents = "none":键盘用户仍能 Tab 进去,回车照样触发,屏幕阅读器照读,表单提交时按钮值(如果带name)可能被发出去 -
btn.hasAttribute("disabled"):语义等价但绕远路,直接读btn.disabled更可靠 - 初始禁用写在 HTML 里更稳妥:
<button id="submit-btn" disabled>提交</button>,JS 启用时再设submitBtn.disabled = false
从 div 读数值判断按钮状态时别用 .value
div 没有 value 属性,el.value 一定返回 undefined,后续转数字就是 NaN,条件判断必然失效。
- 必须用
el.textContent获取文本内容 - 转数字推荐
+el.textContent || 0:一元加号强制转换,NaN时 fallback 为0,避免隐式转换陷阱(比如"012"变成10) - 错误示例:
if (document.getElementById("balance").value >= 100) {...}→ 永远进不去 - 正确写法:
cashoutBtn.disabled = (+balanceEl.textContent || 0)
数值变化时按钮状态不会自动同步
DOM 文本变了,disabled 不会自己重算——你得手动触发更新逻辑。
- 如果是用户输入驱动(
<input>),监听input或change事件 - 如果是 JS 更新的
div,别散落在各处改textContent,封装统一函数:updateBalance(newVal) { balanceEl.textContent = newVal; cashoutBtn.disabled = newVal - 避免重复绑定:同一个按钮别在多个地方反复设
disabled,容易覆盖或冲突 - 不要用
setInterval轮询——性能差、易漏判、难维护
表格行数、多条件组合时的常见坑
基于表格行数控制按钮时,table.rows.length 包含 <thead> 行,直接比较会误判;多条件(如余额 ≥ 100 且表格非空)要显式写出逻辑,别依赖隐式布尔转换。
立即学习“前端免费学习笔记(深入)”;
- 查纯数据行数:用
table.querySelectorAll("tbody tr").length或过滤掉row.sectionRowIndex === -1的表头行 - 复合条件别缩写:
btn.disabled = balance 比 <code>btn.disabled = !(balance >= 100 && rows > 0)更直白不易错 - 注意 DOM 查询时机:确保目标元素已渲染完成,
DOMContentLoaded或document.querySelector前加存在性判断
btn.disabled = ...,而是状态源头分散、更新路径不统一、条件判断没覆盖边界值——这些地方一漏,按钮就“该禁不禁”或“该启不启”。


















