浏览器保留非data-自定义属性但限制访问,html purifier等净化库默认丢弃,dompurify/jsdom等解析器行为取决于配置;data-*是全链路公认的合法私有通道。

HTML 解析器本身不“过滤”非标准属性——它只是按规范决定是否保留、如何暴露、以及能否被后续 JS 或 CSS 访问。关键不在解析器“想不想留”,而在你用的是哪种解析器、运行在哪一层(浏览器渲染 vs 服务端净化)、以及是否启用了白名单机制。
浏览器原生解析:data-* 以外的自定义属性会被保留但不可靠
现代浏览器会把 <div my-id="123"> 这类非 <code>data- 属性保留在 DOM 中,getAttribute('my-id') 能取到值,但:
-
dataset对象完全忽略它——el.dataset.myId是undefined - CSS 属性选择器不认它——
div[my-id="123"]不生效(除非你用getAttribute手动匹配) - HTML 验证器报 warning,W3C 标准不认可,部分严格模式解析器(如 XML 模式)直接拒绝解析
- 某些前端框架(如 Vue 3 的模板编译器)或 SSR 渲染层可能静默丢弃
HTML Purifier 等净化库:默认丢弃所有非白名单属性
像 HTMLPurifier 这类基于白名单的库,根本不会“看到” my-id 这种属性——它在构建 DOM 树前就根据 HTMLDefinition 做了属性级裁剪。没显式声明的属性一律剔除,不管是不是 data- 开头。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 要保留
my-id,必须调用$def->addAttribute('div', 'my-id', 'CDATA') - 但更推荐改用
data-my-id:无需额外配置,天然在白名单里(HTML5 规范已内置支持) - 若硬要用非
data-属性,注意HTMLPurifier的AttrDef类型限制——比如Enum#val1,val2只允许指定值,URI会校验协议
DOMPurify / jsdom 等客户端/服务端解析器:行为取决于配置粒度
DOMPurify 默认只放行标准属性 + data- 系列;jsdom 则更宽松,原样保留所有属性,但它的“保留”不等于“可用”:
-
jsdom里el.myId不是属性访问入口,仍得走getAttribute('my-id') -
DOMPurify.sanitize(html, { ADD_ATTR: ['my-id'] })可手动加入白名单,但需同步指定类型(如'CDATA') - 服务端用
lxml.html时,elem.attrib字典会包含my-id,但若后续转成字符串再喂给前端,可能触发二次净化丢失
真正容易被忽略的点是:属性存留与否,不是由 HTML 语法决定的,而是由**紧贴你代码下游的那个解析环节**决定的。写 data- 属性能绕过大多数净化逻辑,不是因为它“更安全”,而是因为它是唯一被全链路(浏览器 → 框架 → 净化库 → SSR 引擎)共同承认的“合法私有通道”。其他名字,哪怕叫 x-id 或 datax-id,都得单独打补丁。










