真正跨元素稳定可用的全局属性只有data-*和class;contenteditable、tabindex等需配合使用且在、等非呈现元素上无效。

id、class、data-*、tabindex、title、lang、dir、hidden、contenteditable 等 27 个规范定义的全局属性,**理论上可写在任意 HTML 元素的开始标签中**——包括 <div>、<code><p></p>、<span></span>、<script></script>、<meta>、 甚至自定义标签。但“能写”不等于“有效”,浏览器会按规范静默忽略对某些元素无意义的属性。
哪些全局属性在 <script></script> 或 <meta> 上完全无效
比如 contenteditable="true" 写在 <script></script> 标签上,浏览器不会报错,但也不会启用编辑能力;hidden 加在 <meta> 上同样被忽略——因为这些元素不参与渲染流,没有可视内容或用户交互上下文。这类“语法合法但语义失效”的情况很常见,不能靠“没报错”来判断是否起作用。
-
contenteditable对<script></script>、<style></style>、<meta>、<link>等非呈现元素无效 -
tabindex在<script></script>上设为"0"不会使其获得焦点(它本就不能聚焦) -
draggable在<input type="hidden">上显式设为"true"也无拖拽行为
data-* 和 class 是真正跨元素稳定的两个全局属性
它们不依赖渲染或交互逻辑,只承担数据携带和分类功能,因此在所有元素上都可靠生效:
-
data-id可安全用于<tr>、<code><option></option>、<template></template>,JS 中用element.dataset.id读取 -
class在<svg></svg>、<foreignobject></foreignobject>、<math></math>中也能被 CSS 识别(需注意命名空间兼容性) - 但要注意:
class="1col"这类数字开头的值在 CSS 中无法通过.1col选择器匹配,必须改用data-col="1"或重命名 -
contenteditable="true"+tabindex="0":可聚焦、可编辑、支持键盘导航 -
contenteditable="plaintext-only":保留换行,但禁用粗体/列表等富文本格式(Firefox 支持,Chrome 当前仅当execCommand启用时部分生效) -
tabindex="-1"允许 JS 主动.focus(),但不参与自然 Tab 顺序
tabindex 和 contenteditable 必须配合使用才实际可用
单独写 contenteditable="true",元素内容虽可选中,但键盘无法进入——光标点不进去,Tab 键也跳不过去。必须显式加 tabindex="0" 才能纳入焦点流。
真正需要跨元素通用时,优先选 data-* 存标识、class 做分类;想控制交互行为,得查清目标元素是否属于该属性的“有效作用域”——不是所有全局属性,在所有地方都真·全局。











