HTML 规范的哪一部分导致尖括号内的 URL 被解析为具有属性的 <http:> 元素?
Which part of the HTML specification cause a URL within angle-brackets to be parsed as an <http:> element with attributes?
这是我的 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:>
现在我明白我的代码是不正确的,因为它有一个 URL 包含在 <
和 >
.
中
我想了解浏览器究竟是如何将其解析为 http:
标记,其中部分 URL 被解释为 HTML 属性。
HTML 规范中是否有某些部分会导致这种行为?如果是这样,您能否引用 HTML 规范的这些部分?
据我所知,HTML 规范定义了 HTML 概念,但没有定义如何解析它。解析算法是浏览器程序员的内部课题,他们尽最大努力解析 HTML 即使有错误。
您需要知道的一切都在 section 8.2.4 中。特别是:
最多 <http:
,解析器在 tag name state。元素的标签名称是 http:
,包括冒号,由 </http:>
结束标签证明。
第一个 /
将解析器切换到 self-closing start tag state。
second /
导致解析错误,如步骤 2 中 link 所述,将解析器切换到 before attribute name state.
解析器进入 attribute name state 并继续使用 URL。这就是导致路径的路径被视为属性名称的原因。
当解析器到达下一个/
时,它切换回自闭合开始标记状态并重复步骤2和3,只是不是第二个/
但一个不同的字符(不是 >
)会导致解析错误并将解析器切换回步骤 3 中的属性名称之前的状态。
一旦解析器最终看到 >
,它就会关闭开始标记,发出它,然后照常进行。
这是我的 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:>
现在我明白我的代码是不正确的,因为它有一个 URL 包含在 <
和 >
.
我想了解浏览器究竟是如何将其解析为 http:
标记,其中部分 URL 被解释为 HTML 属性。
HTML 规范中是否有某些部分会导致这种行为?如果是这样,您能否引用 HTML 规范的这些部分?
HTML 规范定义了 HTML 概念,但没有定义如何解析它。解析算法是浏览器程序员的内部课题,他们尽最大努力解析 HTML 即使有错误。
您需要知道的一切都在 section 8.2.4 中。特别是:
最多
<http:
,解析器在 tag name state。元素的标签名称是http:
,包括冒号,由</http:>
结束标签证明。第一个
/
将解析器切换到 self-closing start tag state。second
/
导致解析错误,如步骤 2 中 link 所述,将解析器切换到 before attribute name state.解析器进入 attribute name state 并继续使用 URL。这就是导致路径的路径被视为属性名称的原因。
当解析器到达下一个
/
时,它切换回自闭合开始标记状态并重复步骤2和3,只是不是第二个/
但一个不同的字符(不是>
)会导致解析错误并将解析器切换回步骤 3 中的属性名称之前的状态。一旦解析器最终看到
>
,它就会关闭开始标记,发出它,然后照常进行。