【问题标题】:Why can't a <script> block contain a string constant with the word "</script>" inside? [duplicate]为什么 <script> 块不能包含一个字符串常量,其中包含单词“</script>”? [复制]
【发布时间】:2017-08-07 17:19:26
【问题描述】:

好吧,这纯粹是出于好奇:我希望以下标记在 HTML 文档中有效:

<script>
  var test = "<script>why?
</script>";
</script>

但不会:这会导致“未终止的字符串常量”错误,即第一次出现 &lt;/script&gt; 会终止块,即使它用引号括起来。

有人可以解释为什么会发生这种情况(感谢规范的链接:)?

【问题讨论】:

  • 这个怎么样? var test = "&lt;script&gt;why?&lt;\/script&gt;"; ?
  • 复制。答案在这里:stackoverflow.com/questions/1659749/…
  • “链接到规范的赞赏” 一旦解析器输入了&lt;script&gt; 标签,它就处于“脚本数据状态”。关于找到&lt;/script&gt;start here的真正细节。
  • @JamesThorpe 如果您将此作为答案发布,我会接受它
  • Q 在我寻找规范的相关部分时被骗了 :)

标签: javascript html


【解决方案1】:

您只需要转义 / 字符。

<script>
 var test = "<script>why?<\/script>";
</script>

【讨论】:

    【解决方案2】:

    HTML 解析器对 JavaScript 一无所知。它不知道第一个 &lt;/script&gt; 在字符串文字中。它所看到的只是第一个&lt;/script&gt;,并认为这会关闭块。

    这是一个可能更相关的 JavaScript 示例:

    var foo = "He said: "Let's go!"";
    

    JavaScript 解析器对人类对话的文本表示一无所知(例如,我们通常将“语音”放在引号中)。它所看到的只是第二个引号,并认为这终止了字符串文字。但这不是我们想要的,所以我们必须通过转义内部引号来帮助解析器。

    相关:Why split the <script> tag when writing it with document.write()?

    【讨论】:

    • “相关”如何不重复?还是stackoverflow.com/q/23038617/215552?
    • @MikeMcCaughan:我觉得另一个问题没有很好地解释为什么脚本块在第一次出现&lt;/script&gt; 时终止。但如果this问题的答案只是因为它关闭了脚本块,那么肯定是重复的。
    【解决方案3】:

    HTML 引擎和 JavaScript 引擎是两个不同的东西。首先,HTML 引擎解析文档。然后它将 JavaScript 代码块传递给 JavaScript 引擎。 (还有 CSS 代码到 CSS 引擎等等。)

    由于 HTML 不知道 JavaScript 语法,它会将结束标记视为整体内容的一部分,并愉快地将标记的内容传递给 JavaScript 引擎:

    <script>
        var test = "<script>why?
    </script>
    

    更具体地说,如果您遵循以here 开头的解析规则...

    1. 第一个&lt;script&gt; 将我们置于“脚本数据状态”
    2. 我们一直呆在那里直到第一个 &lt; 进入“脚本数据小于符号状态”
    3. 我们遇到了s,我们返回到“脚本数据状态”
    4. 一些字符之后,我们遇到另一个&lt;,我们进入“脚本数据小于号状态”
    5. 然后我们遇到一个/,在这里我们进入“脚本数据结束标签打开状态”

    您可以继续遵循规范,但基本上它描述了 HTML 引擎如何将每个字符解析为 HTML 语法的分步详细信息,无论我们如何直观地解释这些字符。

    【讨论】:

    • 您能否添加 James Thorpe 在他对我的问题的评论中发布的 W3C 规范的链接(这只是为了增强答案)?
    • @GyumFox:好建议,我更新了答案。我以前从未真正看过规范的那一部分,跟随它很有趣。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2012-11-21
    • 2011-09-02
    相关资源
    最近更新 更多