浏览器如何理解我们使用的命名空间?

时间:2018-08-03 23:25:42

标签: html namespaces

示例:

@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"并不适用于任何内容,因为浏览器无法理解此类名称空间。

1 个答案:

答案 0 :(得分:1)

本质上,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>标记不在其中。有关详细信息,请参见A start tag whose tag name is "svg"the tree construction dispatcherThe rules for parsing tokens in foreign content