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