dom节点属性需通过html字符串序列化实现,常用outerhtml获取完整属性(含data-*、自定义属性),innerhtml+手动拼接可过滤属性,jsdom.serialize()适用于node.js端完整文档输出。
dom 节点属性本身不能单独“序列化”,但实际开发中常需要将带属性的节点(或整个 dom 结构)转为 html 字符串——这本质是序列化其结构与属性的组合结果。关键在于:属性值是否被正确保留、自定义属性是否可见、data-* 是否完整输出。
用 outerHTML 获取单个节点的完整 HTML(含所有属性)
这是最常用、最直接的方式,适用于单个元素节点。它会返回该元素及其全部 HTML 属性(包括 class、id、data-*、自定义属性等),且保持原始大小写(现代浏览器基本保留)。
- 注意:outerHTML 返回的是字符串,不包含父容器;对文本节点、注释节点无效(会返回空或 undefined)
-
示例:
<div id="box" class="active" data-id="123" title="提示">内容</div>→element.outerHTML返回完整字符串 - 限制:无法控制是否省略某些属性(如 style 或内联事件),也无法过滤 data-* 属性
用 innerHTML + 元素标签手动拼接(适合可控输出)
当需排除某些属性(如临时添加的 data-temp)或统一处理 class、style 等时,可手动构造:先读取 tagName 和必要属性,再拼接 innerHTML 内容。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
getAttributeNames()获取所有 HTML 属性名(含自定义属性),再逐个判断是否保留 - 用
element.tagName.toLowerCase()保证标签小写(语义化 HTML 常用) - 对
className、innerHTML等 DOM 属性需映射回对应 HTML 属性名(如class)
用 jsdom.serialize() 处理完整文档(服务端/测试场景)
在 Node.js 环境中,jsdom 提供了完整的序列化能力。它不只是输出 outerHTML,而是生成标准 HTML 文档结构(含 ),所有属性原样保留,包括布尔属性(disabled、checked)和空属性。
- 适用场景:SSR 渲染、快照测试、HTML 模板导出
- 注意:浏览器环境不可用;需引入 jsdom 包,不是原生 API
-
示例:
dom.serialize()输出包含 DOCTYPE 和完整骨架的字符串
属性序列化的常见陷阱
序列化看似简单,但容易忽略细节导致属性丢失或格式异常:
-
class 与 className:用
element.className读取没问题,但若用setAttribute('class',...)再序列化,会正常输出;直接改element.className同样生效 -
data-* 属性:必须用
getAttribute('data-xxx')读取,element.dataset.xxx是只读代理,修改它不会反映在序列化结果中 -
布尔属性:如
disabled,设置el.disabled = true后,outerHTML会显示disabled="";用setAttribute('disabled','')效果相同 -
style 属性:内联样式会被完整保留,但若通过
element.style.color = 'red'设置,会自动转为style="color: red;"并出现在序列化结果中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










