【发布时间】:2020-12-12 14:17:17
【问题描述】:
如果我说:
Welcome
代替:
<!DOCKTYPE html>
<html>
<body>
Welcome
</body>
</html>
在我的index.html 中,这会导致某些浏览器出现问题吗?
【问题讨论】:
如果我说:
Welcome
代替:
<!DOCKTYPE html>
<html>
<body>
Welcome
</body>
</html>
在我的index.html 中,这会导致某些浏览器出现问题吗?
【问题讨论】:
浏览器依靠 HTTP Content-Type 标头来确定应该如何解析内容。
“以纯文本发送”通常是指使用Content-Type: text/plain,但我假设您的 index.html 始终以text/html 发送,问题仅与文件内容有关。
使用Content-Type: text/html 调用HTML 解析器,它为两个输入生成几乎相同的DOM,除了DOCTYPE 声明(假设您的意思是<!DOCTYPE html>,而不是DOCKTYPE)。
一般来说,省略 DOCTYPE 会将页面放入所谓的"quirks mode",其中有a number of effects in certain edge-cases。
【讨论】:
当浏览器尝试construct the DOM tree 时,它会发现stack of open elements 为空。因此,insertion mode 将设置为 initial,如参考链接中所述:
插入模式是控制初级的状态变量 树构建阶段的操作。 最初,插入模式是“初始”。
因此,您到达Initial insertion mode 并遵循一系列其他情况,当它们经历几种插入模式时,会自动继续创建和关闭<html>、<head> 和<body> 标记,并在后者中附加您的纯文本。
但是要知道,如果您仅发送带有 .txt 文件的纯文本,浏览器也会将任何最终标记视为纯文本并将所有内容包装到 <pre> 标记中,因为内容类型很可能设置为 text/plain 并且浏览器假定您希望以纯文本形式查看所有内容。
相反,在您的情况下,将纯文本放入 .html 文件中仍会将内容类型设置为 text/html,从而使浏览器能够识别其中写入的最终标签,而无需将您的代码包装到 <pre> 标签中。
因此,在最后一种情况下,您的问题中显示的两个内容创建的 DOM 树将没有区别。
实际上除了一个:在您的情况下,DOCTYPE 声明被省略,这将使浏览器使用 Quirk mode 而不是标准页面呈现您的页面,这可能会导致 unwanted results。
【讨论】: