语义化按钮首选而非或伪装;必设type属性;仅允许phrasing content嵌套;禁用时同步视觉反馈;移动端需处理300ms延迟与点击穿透。
或 伪装的“按钮”。用 浏览器自动处理焦点、空格/回车触发、屏幕阅读器识别;用 会丢掉键盘可访问性,且在表单中可能意外提交。 必须加 type 属性:type="button"(防点击提交表单)、type="submit"(表单内明确提交意图)、type="reset"(慎用) 避免在 里嵌套 或 ,只允许 phrasing content(如 、、文本) 不要用 disabled 同时配 onclick —— disabled 会让事件监听器完全失效,不是“拦截”,是“不触发” 点击事件绑定:addEventListener 还是 onclick 属性 优先用 addEventListener。直接写 onclick="doSomething()" 在 HTML 里,会导致逻辑和结构耦合、无法动态移除、作用域混乱(比如闭包变量捕获出错),还容易被 CSP 策略拦截。 单个按钮多次绑定 addEventListener 不冲突,可叠加多个回调 动态创建的按钮,必须等 dom 节点挂载后再绑定,或用事件委托(见下一条) 如果用事件委托,监听父容器,用 event.target.matches('button[data-action]') 精准判断是否点中目标按钮,避免误触 按钮禁用状态与加载态怎么同步更新 禁用按钮不能只靠 button.disabled = true,还要视觉反馈一致。常见错误是禁用后没改样式,用户看不出操作已被锁定。 禁用时,CSS 中用 button:disabled 或 button[disabled] 设置灰阶、透明度、cursor: not-allowed 加载中状态建议额外加 data-loading="true" 属性,而非仅依赖 disabled —— 因为有些场景需保留禁用但显示不同文案(如“重试”) 异步操作完成前,务必在 finally 块里恢复按钮状态,否则容易卡死在 loading/disabled 状态: button.disabled = true; fetch('/api').then(...).catch(...).finally(() => { button.disabled = false; }); 移动端按钮点击无响应?300ms 延迟和点击穿透问题 ios safari 和旧版 android 浏览器对 默认有约 300ms 点击延迟,用于判断是否双击缩放;另外,position: fixed + z-index 错乱可能导致点击穿透到下层元素。 解决延迟:给 加 width=device-width, initial-scale=1,现代浏览器基本自动关闭延迟;不用第三方库(如 fastclick)也能解决 点击穿透典型场景:弹窗遮罩层用 opacity: 0 但没设 pointer-events: none,导致点击穿透到背后按钮;正确做法是用 visibility: hidden 或 display: none 隐藏,或显式加 pointer-events: none 移动端按钮最小尺寸建议 ≥ 44×44px,否则手指点不准,尤其在 iOS 上容易误判为滑动 按钮交互看似简单,但禁用逻辑、事件绑定时机、移动端响应细节,三处最容易漏测——上线后用户点不动、点两次、点错地方,往往就卡在这几个点上。 php格式文件用atom打开怎么调试_php文件atom调试设置【步骤】 HTML5怎么检测视频缓冲进度_获取视频缓冲百分比的实现【指南】 如何精准控制页脚元素与页面底部的间距 React Context异步认证状态管理:解决保护路由更新延迟问题 c# SynchronizationContext.Post 和 Send 的区别上一篇 PHP文件上传与数据库怎么关联_上传文件信息存入数据库操作【方法】下一篇
会丢掉键盘可访问性,且在表单中可能意外提交。 必须加 type 属性:type="button"(防点击提交表单)、type="submit"(表单内明确提交意图)、type="reset"(慎用) 避免在 里嵌套 或 ,只允许 phrasing content(如 、、文本) 不要用 disabled 同时配 onclick —— disabled 会让事件监听器完全失效,不是“拦截”,是“不触发” 点击事件绑定:addEventListener 还是 onclick 属性 优先用 addEventListener。直接写 onclick="doSomething()" 在 HTML 里,会导致逻辑和结构耦合、无法动态移除、作用域混乱(比如闭包变量捕获出错),还容易被 CSP 策略拦截。 单个按钮多次绑定 addEventListener 不冲突,可叠加多个回调 动态创建的按钮,必须等 dom 节点挂载后再绑定,或用事件委托(见下一条) 如果用事件委托,监听父容器,用 event.target.matches('button[data-action]') 精准判断是否点中目标按钮,避免误触 按钮禁用状态与加载态怎么同步更新 禁用按钮不能只靠 button.disabled = true,还要视觉反馈一致。常见错误是禁用后没改样式,用户看不出操作已被锁定。 禁用时,CSS 中用 button:disabled 或 button[disabled] 设置灰阶、透明度、cursor: not-allowed 加载中状态建议额外加 data-loading="true" 属性,而非仅依赖 disabled —— 因为有些场景需保留禁用但显示不同文案(如“重试”) 异步操作完成前,务必在 finally 块里恢复按钮状态,否则容易卡死在 loading/disabled 状态: button.disabled = true; fetch('/api').then(...).catch(...).finally(() => { button.disabled = false; }); 移动端按钮点击无响应?300ms 延迟和点击穿透问题 ios safari 和旧版 android 浏览器对 默认有约 300ms 点击延迟,用于判断是否双击缩放;另外,position: fixed + z-index 错乱可能导致点击穿透到下层元素。 解决延迟:给 加 width=device-width, initial-scale=1,现代浏览器基本自动关闭延迟;不用第三方库(如 fastclick)也能解决 点击穿透典型场景:弹窗遮罩层用 opacity: 0 但没设 pointer-events: none,导致点击穿透到背后按钮;正确做法是用 visibility: hidden 或 display: none 隐藏,或显式加 pointer-events: none 移动端按钮最小尺寸建议 ≥ 44×44px,否则手指点不准,尤其在 iOS 上容易误判为滑动 按钮交互看似简单,但禁用逻辑、事件绑定时机、移动端响应细节,三处最容易漏测——上线后用户点不动、点两次、点错地方,往往就卡在这几个点上。
type
type="button"
type="submit"
type="reset"
或 ,只允许 phrasing content(如 、、文本) 不要用 disabled 同时配 onclick —— disabled 会让事件监听器完全失效,不是“拦截”,是“不触发” 点击事件绑定:addEventListener 还是 onclick 属性 优先用 addEventListener。直接写 onclick="doSomething()" 在 HTML 里,会导致逻辑和结构耦合、无法动态移除、作用域混乱(比如闭包变量捕获出错),还容易被 CSP 策略拦截。 单个按钮多次绑定 addEventListener 不冲突,可叠加多个回调 动态创建的按钮,必须等 dom 节点挂载后再绑定,或用事件委托(见下一条) 如果用事件委托,监听父容器,用 event.target.matches('button[data-action]') 精准判断是否点中目标按钮,避免误触 按钮禁用状态与加载态怎么同步更新 禁用按钮不能只靠 button.disabled = true,还要视觉反馈一致。常见错误是禁用后没改样式,用户看不出操作已被锁定。 禁用时,CSS 中用 button:disabled 或 button[disabled] 设置灰阶、透明度、cursor: not-allowed 加载中状态建议额外加 data-loading="true" 属性,而非仅依赖 disabled —— 因为有些场景需保留禁用但显示不同文案(如“重试”) 异步操作完成前,务必在 finally 块里恢复按钮状态,否则容易卡死在 loading/disabled 状态: button.disabled = true; fetch('/api').then(...).catch(...).finally(() => { button.disabled = false; }); 移动端按钮点击无响应?300ms 延迟和点击穿透问题 ios safari 和旧版 android 浏览器对 默认有约 300ms 点击延迟,用于判断是否双击缩放;另外,position: fixed + z-index 错乱可能导致点击穿透到下层元素。 解决延迟:给 加 width=device-width, initial-scale=1,现代浏览器基本自动关闭延迟;不用第三方库(如 fastclick)也能解决 点击穿透典型场景:弹窗遮罩层用 opacity: 0 但没设 pointer-events: none,导致点击穿透到背后按钮;正确做法是用 visibility: hidden 或 display: none 隐藏,或显式加 pointer-events: none 移动端按钮最小尺寸建议 ≥ 44×44px,否则手指点不准,尤其在 iOS 上容易误判为滑动 按钮交互看似简单,但禁用逻辑、事件绑定时机、移动端响应细节,三处最容易漏测——上线后用户点不动、点两次、点错地方,往往就卡在这几个点上。
disabled
onclick
优先用 addEventListener。直接写 onclick="doSomething()" 在 HTML 里,会导致逻辑和结构耦合、无法动态移除、作用域混乱(比如闭包变量捕获出错),还容易被 CSP 策略拦截。
addEventListener
onclick="doSomething()"
event.target.matches('button[data-action]')
禁用按钮不能只靠 button.disabled = true,还要视觉反馈一致。常见错误是禁用后没改样式,用户看不出操作已被锁定。
button.disabled = true
button:disabled
button[disabled]
cursor: not-allowed
data-loading="true"
finally
button.disabled = true; fetch('/api').then(...).catch(...).finally(() => { button.disabled = false; });
ios safari 和旧版 android 浏览器对 默认有约 300ms 点击延迟,用于判断是否双击缩放;另外,position: fixed + z-index 错乱可能导致点击穿透到下层元素。
position: fixed
z-index
width=device-width, initial-scale=1
opacity: 0
pointer-events: none
visibility: hidden
display: none
按钮交互看似简单,但禁用逻辑、事件绑定时机、移动端响应细节,三处最容易漏测——上线后用户点不动、点两次、点错地方,往往就卡在这几个点上。
c# SynchronizationContext.Post 和 Send 的区别
PHP文件上传与数据库怎么关联_上传文件信息存入数据库操作【方法】