html - 浏览器如何理解我们使用的命名空间?
问题描述
例子:
@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"
它不适用于任何东西,因为浏览器不理解这样的命名空间。
解决方案
本质上,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”的开始标记、树构造调度程序和 解析外部内容中的标记的规则。
推荐阅读
- sql - 在使用 Spring MVC 时,我试图使用 @Controller 将表数据插入另一个表数据,但不知道如何
- django - Django中的继承
- io - NVMe SSD 上的 GFortran 未格式化 I/O 吞吐量
- android - 颤动的aar文件没有在lib中给出类
- java - 为什么这个函数不返回回文数?
- python - 如何将数据框中的字符串数据更改为数字?
- angular - 从另一个元素传递模板引用会给出未定义的 ngIf
- django - Django:如何检查查询集中的元素?
- mongodb - 我从带有 MongoDB 的 Laravel 护照收到 BadMethodCallException "Client::confidential()"
- node.js - 在服务之间加密和解密密码的最佳实践