为什么浏览器解析<script>标签的方式不同?

时间:2019-04-23 01:08:57

标签: javascript html xml svg

我正在开发一个新站点,并且在编写一些客户端HTML / Javascript代码时遇到了这种情况。

如果 警报必须弹出&gt; ,因为我相信HTML解析器首先在 。这次我看到的是弹出窗口,显示的是> 而不是&gt; 。尽管我可以理解这是由于 标记引起的,但是我不确定其根本原因是什么,除了 以外的其他标记是否会更改默认行为。

如果有人可以指向官方文档,那将非常有帮助。

这是我为此场景创建的一个简单的JSFiddle- https://jsfiddle.net/emz8Lfxt/

3 个答案:

答案 0 :(得分:1)

浏览器专门解析<script>,它们不会替换其中的HTML实体。这使您可以编写如下内容:

if (a < b)

不必写:

if (a &lt; b)

在早期的浏览器中,您必须编写以下内容:

<script type="text/javascript">
<![CDATA[
  …
]]>
</script>

CDATA部分没有执行实体订阅,因此您可以在其中“正常”编写代码。

但是后来HTML规范将<script>正文设为默认设置,因此不再需要。

但是,当<script>位于<svg>内部时,显然SVG解析器优先。因此&gt;被翻译为>

答案 1 :(得分:1)

说实话,我觉得您很难找到发生这种情况的官方文档。

在这种情况下,我的最佳猜测是,由于SVG元素是SVG图形的容器,并且SVG容器基于XML,并且其中可以包含其他HTML元素;例如:

<svg>
    <rect style="fill:rgb(0,0,255);" />
</svg>

浏览器尝试解析内部html,以绘制对象。但是,一旦它意识到自己并不是真正的SVG元素,它就会停止并继续执行您在那里的JavaScript。因此,&gt;会在执行javascript之前被解析。

我觉得我们需要一个对SVG元素的处理方式有深入了解的人。

我将注意此示例以供参考:

<script>alert("&gt;")</script>
<svg><script>alert("&gt;")</script></svg>
<span><script>alert("&gt;")</script></span>

按顺序输出:

&gt;
>
&gt;

答案 2 :(得分:0)

解析器将HTML文档中的嵌入式SVG视为foreign element。然后,它的内容由SVG解析器解析,因此该SVGElement的所有内容都被解析为SVG。

SVG具有