当我看到解决http://escape.alf.nu第15级的答案时,我注意到
<!DOCTYPE HTML>
<html>
<body>
<script>
var a = '<!--<script>';
</script>
<p>Test</p>
</body>
</html>
但这两个脚本将显示“Test”:
<!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>
我不明白,为什么会这样?
这将是内部机制中违反的一些假设。
试图合理化这些东西没有多大意义。
你写了无效的超文本标记语言,所以任何事情都可能发生。
这就提出了一个重要的观点,
这段代码不是有效的HTML5语法,所以在HTML5规范中没有任何东西可以给我们关于这里发生了什么的线索。具体来说,有两个问题:
有一个
这两个问题都会使浏览器的HTML解析器进入错误解析模式,这意味着它们试图理解无效语法。浏览器在试图理解无效语法时所做的是未定义的行为,这在技术上意味着任何事情都可能发生(比如鼻魔)。这里事实上的行为似乎是浏览器同意如何处理这种未定义的行为,但这仍然是未定义的行为。
无论出于什么原因,这种语法问题的组合会导致浏览器忽略文档中稍后的文本。
编辑:我已经确定了解析错误是如何通过遍历HTML5规范的这一部分产生的。
脚本的文本内容(不包括空格)为
var a = '<!--<script>';
这必须符合以下语法规则:
data1 *( escape [ script-start data3 ] "-->" data1 ) [ escape ]
我们可以通过匹配
data1
开始解析文本内容,这有以下规则:
data1 = < any string that doesn't contain a substring that matches not-data1 >
not-data1 = "<!--"
也就是说,字符串
var a='
与data1
产品匹配。因为下一部分是
如果脚本后面有任何文本,它必须与
转义
产品相匹配,如下所示:
escape = "<!--" data2 *( script-start data3 script-end data2 )
让我们把课文的下一部分配对。到目前为止,我们已经
data1 var a = '
escape <!--
data2 ???
现在,
data2
中不能包含任何内容,因为data2
生产禁止子字符串
data2 = < any string that doesn't contain a substring that matches not-data2 >
not-data2 = script-start / "-->"
lexer无法根据语法执行有效步骤,因此浏览器现在必须进入错误处理。
本文向大家介绍你们做移动端平时在什么浏览器上测试?相关面试题,主要包含被问及你们做移动端平时在什么浏览器上测试?时的应答技巧和注意事项,需要的朋友参考一下 Chrome,Safari,微信X5, UC,其他手机自带浏览器
本文向大家介绍你做的页面在哪些浏览器测试过?这些浏览器的内核分别是什么?相关面试题,主要包含被问及你做的页面在哪些浏览器测试过?这些浏览器的内核分别是什么?时的应答技巧和注意事项,需要的朋友参考一下 IE内核浏览器:360,傲游,搜狗,世界之窗,腾讯TT。 非IE内核浏览器:firefox opera safari chrome 。 IE浏览器的内核Trident、Mozilla的Gecko、Ch
本文向大家介绍浏览器中window.length的结果是什么?为什么?相关面试题,主要包含被问及浏览器中window.length的结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 神奇的问题,神奇的答案
我正在研究SAML和SSO,看起来使用SAML的应用程序需要是一个web应用程序,并且依赖于浏览器。 有人能告诉我为什么吗? 我对SAML的有限知识告诉我,SAML依赖于会话和cookie,这在桌面应用程序或移动应用程序中是不可用的。这是唯一的原因吗?你能告诉我更多的细节吗?
gRPC基于HTTP/2,浏览器广泛支持HTTP/2(假设)。因此,我觉得从浏览器使用gRPC应该没有问题。 然而,很明显有一个问题。协议grpc web是不同的,因为“由于浏览器限制”而存在。还有许多博客文章描述了为让gRPC从浏览器工作而部署的复杂技术堆栈。 我忽略了实际的问题——为什么gRPC不只是在浏览器上工作?
根据我的理解,虚拟DOM是一个由Javascript对象组成的树,有父/子对象等,但没有真正DOM的大部分“沉重”特性。框架(例如React/VUE)通过从头创建一个虚拟DOM来响应模型状态的变化,然后对虚拟DOM的最后一个版本进行比较,以确定要改变什么真实的DOM。 我读过的许多文章都声称虚拟DOM的速度更快,因为真正的DOM在每次发生更改时都必须重新布局(甚至重新绘制),但事实并非如此--只有