
在 html 中,普通元素(如 ``)的 `tagname` 返回大写(如 `"a"`),而 svg 元素(如 `` 在 `
HTML 和 SVG 在浏览器中的处理机制本质不同:HTML 使用不区分大小写的解析器,其元素名在 DOM 中统一规范化为大写(例如 <div>、 <A>、 <Li> 均生成 tagName === "DIV" 或 "A");而 SVG 最初是作为 XML 应用定义的(http://www.w3.org/2000/svg),XML 天然严格区分大小写,且 DOM Level 2 Core 规范明确要求:tagName 必须大小写保持(case-preserving) —— 即如实反映源码中声明的标签名。
当 SVG 被内联嵌入 HTML 文档(如通过 <svg> 标签)时,浏览器会依据命名空间(xmlns="http://www.w3.org/2000/svg")识别其为 XML 内容,从而启用 XML 解析模式。此时,即使书写为 <a>,它也被视为 SVG 命名空间下的合法元素(注意:SVG 1.1 确实定义了 <a> 作为可点击容器),其 tagName 属性将原样返回小写 "a",而非 HTML 模式下的 "A"。
可通过以下代码验证该行为:
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<a id="svg-a" href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b"><circle r="20"/></a>
</svg>
<a id="html-a" href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b">HTML Link</a>
<script>
console.log(document.getElementById('svg-a').tagName); // "a"(小写,XML 模式)
console.log(document.getElementById('html-a').tagName); // "A"(大写,HTML 模式)
</script>⚠️ 注意事项:
- 此行为与浏览器是否“支持 SVG”无关,而是由文档类型和命名空间触发的标准化解析流程;
- 不要依赖 tagName 进行大小写不敏感的元素判断,推荐使用 localName(始终小写)或 nodeName(同 tagName,但更语义准确),或直接用 element instanceof SVGAElement 等类型检测;
- 在 XHTML(真正的 XML MIME 类型)文档中,所有元素(包括 HTML 类元素)的 tagName 都将保持原始大小写,进一步印证该机制源于 XML 解析上下文。
简言之:tagName 的大小写表现不是 bug,而是 DOM 规范对 XML 与 HTML 双模兼容的设计体现——它忠实地反映了底层解析器的语义模型。理解这一点,有助于写出更健壮的跨环境 DOM 操作逻辑。










