首页 > 解决方案 > 浏览器如何理解我们使用的命名空间?

问题描述

例子:

@namespace html "http://www.w3.org/1999/xhtml";
@namespace svg "http://www.w3.org/2000/svg";

html|a{ 
    text-decoration: underline;
    color: blue;
}
svg|a {
    stroke: red;
}
<a href="#">link</a>
<svg>
  <a href="#">
    <text y="21" x="60">link</text>
  </a>
</svg>

如您所见,有 2 个链接,但每个链接的规则是不同的,因为浏览器理解我所指的空间。那么浏览器如何理解我正在使用的命名空间呢?因为如果你写@namespace my "http://example.com"它不适用于任何东西,因为浏览器不理解这样的命名空间。

标签: htmlnamespaces

解决方案


本质上,HTML5 解析器在处理每个标记时会查看将成为下一个要添加到 DOM 的元素的父元素的元素。通常,它将每个元素放在与其父元素相同的命名空间中。它开始期望元素在http://www.w3.org/1999/xhtml命名空间中,但是当它处理<svg>开始标签时,它知道<svg>元素在http://www.w3.org/2000/svg命名空间中。因此 svg 元素包含的元素也被放入http://www.w3.org/2000/svg命名空间中。当它处理</svg>结束标签时,下一个标签的父元素不会是 svg 元素,所以它会再次期待http://www.w3.org/1999/xhtml命名空间中的元素。

其他标签也可以导致切换回http://www.w3.org/1999/xhtml命名空间,但<a></a>标签不在其中。有关详细信息,请参阅标记名称为“svg”的开始标记树构造调度程序和 解析外部内容中的标记的规则


推荐阅读