nodeName适用于所有节点并返回对应类型名(如“DIV”“#text”),tagName仅适用于元素节点且对非元素节点访问返回undefined。

nodeName 和 tagName 都能获取 DOM 元素的标签名,但适用范围和行为有关键区别:nodeName 通用性强(适用于所有节点),tagName 仅适用于元素节点,且两者在大小写处理、文本节点表现上不同。
nodeName:适用于所有节点类型,返回大写标签名(元素)或节点类型名
nodeName 是 Node 接口的属性,所有节点(元素、文本、注释、文档等)都支持。对元素节点,它返回大写的标签名;对非元素节点,返回对应类型字符串:
- 元素 → nodeName === "DIV"
- 文本节点 → nodeName === "#text"
- 注释节点 → nodeName === "#comment"
- document 节点 → nodeName === "#document"
注意:HTML 中 tagName 和 nodeName 对元素节点都返回大写(即使 HTML 是小写),这是规范行为,与文档解析模式无关(HTML 文档始终不区分大小写解析,但 DOM 属性统一返回大写)。
tagName:只适用于元素节点,返回大写标签名,其他节点访问会报错
tagName 是 Element 接口的属性,**仅元素节点(Element 实例)拥有该属性**。尝试在文本节点、document 或 documentFragment 上读取 tagName 会返回 undefined(不报错),但在严格模式或某些旧环境可能引发异常(实际中多数浏览器静默返回 undefined):
Blender Geometry Nodes Script Generator下载生成Blender Python (bpy)脚本,该脚本使用node_groups API和GeometryNodeTree接口程序化地创建几何节点修改器树,用于参数化3D资产生成。
立即学习“Java免费学习笔记(深入)”;
-
document.body.tagName→ "BODY" -
document.body.firstChild.tagName(若为文本节点)→ undefined -
document.tagName→ undefined(document 不是 Element)
因此,使用 tagName 前建议先判断
node.nodeType === Node.ELEMENT_NODE或node instanceof Element。如何安全、准确地获取“标签名”?推荐按需选择
根据使用场景选择更稳妥的方式:
- 只处理元素节点(如遍历
querySelectorAll结果)→ 直接用 tagName,语义清晰、意图明确 - 需要统一处理各种节点(如递归遍历整个 DOM 树)→ 用 nodeName,并根据值判断类型(
=== "DIV"、=== "#text"等) - 想忽略大小写比较 → 统一转小写:
el.nodeName.toLowerCase()或el.tagName?.toLowerCase()(可选链防 undefined) - 现代开发中更推荐
el.localName(兼容命名空间,且返回原始大小写,但 HTML 元素仍为小写)——不过兼容性略低于 nodeName/tagName
常见误区提醒
不要假设
tagName在所有节点上都有效;不要用nodeName === "div"做匹配(应写"DIV");自定义元素(如<my-button></my-button>)的 nodeName/tagName 返回的是实际标签名("MY-BUTTON"),不是小写形式;SVG 元素在 HTML 文档中 nodeName 仍为大写("SVG"、"PATH"),符合 HTML 规范而非 XML 规则。

















