全部分类
千萱大大_8581
2026-06-04
274人浏览
原创
本文详解如何准确判断一个表单控件(如 input、button)是自身被禁用,还是因外层 继承禁用,并提供兼容、可靠、无障碍友好的 JavaScript 检测方法。
本文详解如何准确判断一个表单控件(如 input、button)是自身被禁用,还是因外层 `
在 HTML 表单开发中,
el.disabled 仅反映元素自身是否显式声明了 disabled 属性(即属性级禁用),它不会返回因父 fieldset 导致的继承禁用状态。因此,必须结合 DOM 遍历与 CSS 伪类双重验证:
function isTrulyDisabled(el) { return el.matches(':disabled'); } // 示例使用 const input = document.querySelector('#txt1'); console.log(isTrulyDisabled(input)); // true(被 fieldset 禁用)
✅ 优势:
将使用 `` 约定的 HTML 幻灯片转换为高保真、矢量文本 PDF(使用 Playwright + Chromium 原生 PDF 功能)。
⚠️ 注意:IE 和 Safari ≤15.3 不支持 :disabled 匹配继承禁用的元素,需降级处理(见下文兜底方案)。
function isTrulyDisabled(el) { // 1. 先检查自身是否显式禁用 if (el.disabled) return true; // 2. 向上查找最近的 disabled fieldset(跳过 legend 内部) let parent = el.parentElement; while (parent) { if (parent instanceof HTMLFieldSetElement && parent.disabled) { // 特殊处理:legend 元素内的控件不受父 fieldset 禁用影响(HTML 规范强制) if (parent.querySelector('legend')?.contains(el)) { return false; } return true; } parent = parent.parentElement; } return false; }
// 兜底兼容:先尝试 :disabled,失败则回退遍历 function isTrulyDisabled(el) { try { if (typeof el.matches === 'function') { return el.matches(':disabled'); } } catch (e) { // Safari 15.3- 可能抛错,或不支持 :disabled 继承 } // 降级:手动遍历 if (el.disabled) return true; let p = el.parentElement; while (p) { if (p instanceof HTMLFieldSetElement && p.hasAttribute('disabled')) { // 检查是否在 legend 内 const legend = p.querySelector('legend'); if (!legend || !legend.contains(el)) { return true; } } p = p.parentElement; } return false; }
是唯一例外区域:即使 fieldset 被禁用,其 标签内直接编写的任何表单控件(如 同意条款)始终可交互——这是 HTML 规范明确要求的行为,非 bug,切勿试图用 CSS 遮盖替代。
自定义组件需透传 disabled:Vue/React 封装的 若未将 disabled prop 透传至底层 ,则 :disabled 和遍历逻辑均失效。务必在组件内部同步状态:
<!-- Vue 示例 --> <template><input :disabled="disabled" ...></template><props><prop name="disabled" type="Boolean"></prop></props>
服务端绝不信任前端禁用状态:fieldset disabled 仅是用户体验优化,攻击者可轻松移除属性或构造请求绕过。权限校验必须在服务端完成,且对禁用字段的值做明确白名单/只读校验。
无障碍(a11y)提示:禁用区域应配合 aria-disabled="false"(避免与原生 disabled 冲突)及清晰视觉反馈(如 fieldset:disabled { opacity: 0.7; }),但不可依赖 opacity 作为唯一禁用标识——屏幕阅读器依赖的是原生 :disabled 状态。
掌握这一检测机制,不仅能精准响应用户交互(如点击前拦截)、实现动态表单分组开关,更能构建健壮、可访问、前后端权责清晰的表单系统。
前端入门到VUE实战笔记:立即使用 在学习笔记中,你将探索 前端 的入门与实战技巧!
相关文章
PHP 中 POST 提交的 \n 字符串需手动转换为真实换行符
如何让文字随背景图自适应缩放以适配不同屏幕尺寸
如何预获取外部 JSON 数据并在 JavaScript 中高效使用
如何在 Go 中将 HTML 模板嵌入二进制可执行文件
如何在 Go 应用中嵌入 HTML 模板(Go 1.16+ 原生方案)
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:如何使用计算属性名实现全栈开发中数据表字段的动态解耦
下一篇:如何规避在无限循环微任务中动态创建新微任务引发的网页假死
作者最新文章
RxJS 数据扁平化实战:高效合并嵌套响应数组的正确姿势
React 中 useCallback 依赖数组的正确填写规则
如何在 Google Tag Manager 中通过字段标签精准提取价格值
MongoDB聚合管道中$in操作符的正确用法详解
MongoDB聚合管道中正确使用$in操作符的实践指南
MongoDB 聚合管道中正确使用 $in 操作符的完整指南
MongoDB 多字段条件更新的最佳实践:使用聚合管道实现单次原子操作
MongoDB 聚合管道中 $in 操作符的正确用法详解
如何在 Angular 中实现无缝循环品牌轮播滑块(无第三方库)
Angular 中实现循环品牌轮播滑块(无第三方库)
热门AI工具
豆包大模型
UP简历
火山引擎
UpDream
DeepSeek
音述AI
讯飞智作
蛙蛙写作
相关专题
html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
2023.06.14
4855
7
html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。
2023.06.21
2852
4
html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。
2023.07.31
2510
5
html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。
2023.08.01
2539
HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。
2023.08.11
4519
6
在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。
2481
3
html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。
2023.08.31
2269
html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。
2023.09.01
2088
HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。
2023.09.20
2048
热门下载
相关下载
精品课程
共0课时 | 0人学习
共1课时 | 204人学习
共6课时 | 54.6万人学习
共89课时 | 133.1万人学习
共49课时 | 82万人学习
共22课时 | 2.4万人学习
共31课时 | 3.3万人学习
共28课时 | 4.3万人学习
最新文章