Javascript 为什么<--&书信电报;脚本>;是否在浏览器上导致DOM树中断?

Javascript 为什么<--&书信电报;脚本>;是否在浏览器上导致DOM树中断?,javascript,dom,html,Javascript,Dom,Html,当我看到解决第15级问题的答案时,我注意到内部机制违反了一些假设 试图合理化这些东西没有多大意义 ,所以任何事情都有可能发生。这提出了一个重要的观点,即HTML页面上的标记内部的文本在被Javascript解析器解析之前由HTML解析器解析 这段代码不是有效的HTML5语法,因此HTML5规范中没有任何东西可以为我们提供关于这里发生了什么的线索。具体而言,有两个问题: 有一个标记,没有结束 有一个开口。(见附件) 这两个问题都会使浏览器的HTML解析器进入错误解析模式,这意味着它们试图理解无

当我看到解决第15级问题的答案时,我注意到内部机制违反了一些假设

试图合理化这些东西没有多大意义


,所以任何事情都有可能发生。

这提出了一个重要的观点,即HTML页面上的
标记内部的文本在被Javascript解析器解析之前由HTML解析器解析

这段代码不是有效的HTML5语法,因此HTML5规范中没有任何东西可以为我们提供关于这里发生了什么的线索。具体而言,有两个问题:

  • 有一个
    标记,没有结束
  • 有一个开口
    。(见附件)
这两个问题都会使浏览器的HTML解析器进入错误解析模式,这意味着它们试图理解无效语法。浏览器在试图理解无效语法时所做的是未定义的行为,这在技术上意味着任何事情都可能发生(例如)。这里事实上的行为似乎是浏览器同意如何处理这种未定义的行为,但这仍然是未定义的行为

无论出于何种原因,这种语法问题的组合会导致浏览器忽略文档后面的文本


编辑:我已经通过单步执行确定了解析错误是如何产生的

脚本的文本内容(不包括空格)为

我们可以通过匹配
data1
开始解析文本内容,这有以下规则:

data1=<任何不包含与not-data1匹配的子字符串的字符串>
not-data1=“”

lexer无法根据语法执行有效步骤,因此浏览器现在必须进入错误处理。

@ruakh:我没有混淆任何东西。计算机系统必须选择如何处理无效输入的原则是普遍和基本的。在浏览器通过向用户显示错误消息来拒绝无效HTML之前,他们必须在呈现时做出“最佳猜测”,除了规范中的一些建议之外(我已经检查过了,没有任何建议),这意味着这完全取决于浏览器。是UB。但是如果你选择把我的问题分解为“Hurr Hur-Urru C++ C++ Hur-Huri”,那么就直接说:我当然不能阻止你。但是为什么呢?它需要周期。这需要时间。它会减慢你的页面速度。所有输入都无效。使输入符合要求,所有问题都会得到解决。而且,是的,
脚本
标记的内容是在中控制的。@gslin:按照我的答案中的链接到W3C验证程序,自己查找!我没说那是个虫子。@ruakh:好的,我会的-今天我没想到。不知道你对C++的固执是什么:对UB的暗示是因为这是所有指定语言的计算机软件的基本原理。此外,我在回答中甚至一次都没有提到。请不要因为你不明白我在说什么就断言我“困惑”了@鲁克:当然可以!如果您做了HTML规范没有定义的任何事情,也就是——根据定义——UB。这不是C++固有的。它是具有特定行为的系统固有的,这些行为没有无限多页的规范。是的,HTML对失败有更多的保护和指导;这并不意味着您可以编写任何看起来像HTML的东西,并假设它具有定义良好的语义。如果你要求我们完全实际地观察这个问题,那么考虑到没有C++编译器会让恶魔飞出你的鼻子。我认为HTML5明确规定了错误处理应该如何工作?这正是我所说的,但时间更长!希望你的答案不会像我的答案那样被糟蹋+1@icktoofay事实上,HTML5精确地描述了解析过程,而且在允许“标记汤”方面,它明显比HTML4.01或XHTML更宽容。然而,如果HTML5规范中的语法无法解析代码,那么就由浏览器来决定该怎么做。
<!DOCTYPE HTML>
<html>
    <body>
        <script>
            var a = '<!--<script>';
        </script>
        <p>Test</p>
    </body>
</html>
<!DOCTYPE HTML>
<html>
    <body>
        <script>
            var a = '<!--';
        </script>
        <p>Test</p>
    </body>
</html>
<!DOCTYPE HTML>
<html>
    <body>
        <script>
            var a = '<script>';
        </script>
        <p>Test</p>
    </body>
</html>
var a = '<!--<script>';