这是我的HTML代码。
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<head>
<title>Bar</title>
<script>
window.onload = function() {
console.log(document.body.innerHTML)
}
</script>
</head>
<body>
<http://www.example.com/foo/bar/baz.html>
</body>
</html>
我将此代码保存在名为bar.html
的文件中,然后使用Firefox或Chrome打开该页面。这是我在控制台中看到的输出。
<http: www.example.com="" foo="" bar="" baz.html="">
</http:>
现在我了解到我的代码不正确,因为它在<
和>
中包含了一个网址。
我想了解浏览器究竟是如何将其解析为http:
标记,其中部分网址被解释为HTML属性。
HTML规范的某些部分是否会导致这种行为?如果是这样,你能引用HTML规范的这些部分吗?
答案 0 :(得分:5)
您需要知道的一切都在section 8.2.4。特别是:
最多<http:
,解析器位于tag name state。元素的标记名称为http:
,包括冒号,如</http:>
结束标记所示。
第一个/
将解析器切换为self-closing start tag state。
second /
导致解析错误,如步骤2中的链接所述,将解析器切换为before attribute name state。
解析器输入attribute name state并继续使用该URL。这就是导致路径路径被视为属性名称的原因。
当解析器到达下一个/
时,它会切换回自闭合开始标记状态并重复步骤2和3,除了它不是第二个{{1}但是一个不同的字符(不是/
)会导致解析错误并在步骤3中将解析器切换回之前的属性名称状态。
解析器最终看到>
后,它会关闭开始标记,发出标记并继续正常进行。
答案 1 :(得分:-3)
据我所知,HTML规范定义了HTML概念,但没有定义如何解析它。解析算法是浏览器程序员的内部主题,他们尽力解析HTML甚至错误。