为什么&#34;&#34;在脚本标记中视为结束标记但是&#34; <h1> hlo </h1>&#34;不渲染任何东西?

时间:2016-01-12 04:46:02

标签: javascript html

我正在读一本书然后我读了这一行: - &#34; HTML解析器不了解您的JavaScript代码;它像任何其他文字一样对待它#34;所以如果我们写:

<script type="text/javascript">
      alert("first");
      var string = "</script>";
</script>

我们收到错误,因为"</script>"作为HTML解析器的结束标记,第二行</script>作为脚本的关闭然后执行该脚本标记,并给出: -

Uncaught SyntaxError: Unexpected token ILLEGAL

即使第一个alert()没有执行?我不知道为什么?但我的主要问题是,如果将"</script>"视为标记,那么当我们写下这样的内容时:

var str = "<h1> hello world </h1>"; 

然后这并没有呈现任何&#34;你好世界&#34;在屏幕上?根据前面的示例,HTML解析器也应该将该字符串视为HTML标记,但它没有?任何人都可以解释一下吗?抱歉英语不好:(

2 个答案:

答案 0 :(得分:2)

您应该了解浏览器的工作原理。如何呈现HTML和Javascript。这是一篇很好的阅读How browsers work

以下文字来自上面的链接。

标记化算法

算法的输出是HTML令牌。该算法表示为状态机。每个状态消耗输入流的一个或多个字符,并根据这些字符更新下一个状态。该决定受当前标记化状态和树构造状态的影响。这意味着相同的消耗字符将为正确的下一状态产生不同的结果,具体取决于当前状态。该算法过于复杂而无法充分发挥,因此让我们看一个简单的例子来帮助我们理解校长。

基本示例 - 标记以下HTML:

<html>
    <body>
        Hello world
    </body>
</html>

初始状态是&#34;数据状态&#34;。当&#34;&lt;&#34;遇到字符,状态变为&#34;标记打开状态&#34;。消费&#34; a-z&#34;字符导致创建&#34;开始标记令牌&#34;,状态变为&#34;标记名称状态&#34;。我们待在这个州,直到&#34;&gt;&#34;字符被消耗。每个字符都附加到新标记名称。在我们的例子中,创建的令牌是&#34; html&#34;令牌。 当&#34;&gt;&#34;达到标记,发出当前令牌,状态变回&#34;数据状态&#34;。 &#34;&#34;标签将通过相同的步骤处理。到目前为止&#34; html&#34;和&#34;身体&#34;标签被发出。我们现在回到了数据状态&#34;。消费&#34; H&#34; &#34; Hello world&#34;将导致创建和发出一个字符令牌,这一直持续到&#34;&lt;&#34; &#34;&#34;到达了。我们将为&#34; Hello world&#34;的每个字符发出一个字符标记。 我们现在回到了标签打开状态&#34;。消费下一个输入&#34; /&#34;将导致创建一个&#34;结束标记令牌&#34;并移动到标签名称状态&#34;。我们再次保持这种状态,直到我们到达&#34;&gt;&#34;然后将发出新的标记令牌,然后我们回到&#34;数据状态&#34;。 &#34;&#34;输入将被视为前一种情况。

同样适用于</script>标签。多数民众赞成如何运作。

答案 1 :(得分:1)

我想我得到了答案, 根据{{​​3}}

  

虽然STYLE和SCRIPT元素使用CDATA作为其数据模型,   对于这些元素,用户代理必须以不同方式处理CDATA。   必须将标记和实体视为原始文本并传递给   按原样申请。第一次出现的字符序列&#34;&lt; /&#34;   (end-tag open delimiter)被视为终止结束   元素的内容。在有效文档中,这将是结束标记   元素。

样式和脚本元素的文本使用CDATA作为其数据模型,并将该文本直接传递给应用程序,(js中的javascript intrepreter和css(?)中的布局引擎)和

第一次出现字符序列&#34;&lt; /&#34;被视为终止元素的结尾(&lt;和/之间没有空格,它没有正常回答,正常吗?)

所以我写的时候: -

var string = "</script>";

组合&#34;&lt; /&#34;作为end处理,文本内容(var string =&#34;)被传递给js intrepreter,我们知道字符串不是correclty结束(&#34;缺失),所以显示错误,然后&#34; );像文本一样处理,并按照规范说&lt;的组合来解决这个问题。 / word作为终结者,我们可以这样写: -

var string = "<\/script>";

这里的html解析器不理解javascript代码所以转义序列不起作用,对于html解析器&lt; /这些都是3个单独的字符,并且还有其他很多变化要打破&#34;&lt; \&#34;令牌序列,

例如: -

var str = "< /script>"; 

(您是否注意到&lt;和/之间的空格,我不知道它是否符合标准,但它是否有效)

var str =&#34;&lt;&#34; +&#34; / script&gt;&#34;;

但也有一点需要记住: -

var str =&#34;&lt; / SCR&#34; +&#34; pt&gt;&#34;也有效。 (忘了空间,空间如此。)

因为根据: -

https://www.w3.org/TR/html4/types.html#type-cdata

  

实际上,浏览器只会结束解析CDATA脚本块   实际的关闭标记。

谢谢,抱歉弱engilsh