Javascript document.write from head标记是否需要等待window.onload?

Javascript document.write from head标记是否需要等待window.onload?,javascript,html,document.write,Javascript,Html,Document.write,我有一大组网站,在标记上有一个include(),这个include从包含javascript代码的文件加载内容,这个代码使用document.write() 浏览器上的代码如下所示: <html> <head> <script>document.write('stuff');</script> </head> <body> content </body> </html> 文件。写(“东西”);

我有一大组网站,在
标记上有一个include(),这个include从包含javascript代码的文件加载内容,这个代码使用document.write()

浏览器上的代码如下所示:

<html>
<head>
<script>document.write('stuff');</script>
</head>
<body>
content
</body>
</html>

文件。写(“东西”);
内容

这似乎工作正常,但我想知道它是否会在某些浏览器/计算机上失败,因为head标记在body标记之前,document.write写入body标记。document.write是否可能在未加载此标记时尝试写入body标记?

下面是一个小测试用例,显示了答案:

<html>
<head>
<script>
    document.write('stuff'); 
    console.log("document has written from head");</script>
</head>
<body>
<script>
    window.onload = function() {
        console.log("on load function has triggered");
    }
</script>
</body>
</html>
因此,是的,head部分中的代码将在onload函数之前运行


请注意,
document.write()
不是您想要练习的东西。根据我的经验,我从未使用过它。它会覆盖DOM,如果您不知道它是如何工作的,它可能会非常糟糕。您应该改用DOM。

下面是一个小测试用例,它显示了答案:

<html>
<head>
<script>
    document.write('stuff'); 
    console.log("document has written from head");</script>
</head>
<body>
<script>
    window.onload = function() {
        console.log("on load function has triggered");
    }
</script>
</body>
</html>
因此,是的,head部分中的代码将在onload函数之前运行

请注意,
document.write()
不是您想要练习的东西。根据我的经验,我从未使用过它。它会覆盖DOM,如果您不知道它是如何工作的,它可能会非常糟糕。您应该改用DOM

document.write from head标记是否需要等待window.onload

不,恰恰相反

文档关闭时将触发加载事件。无法写入已关闭的文档,因此调用
write
会隐式调用
open
并删除现有文档

这似乎工作正常,但我想知道它是否会在某些浏览器/计算机上失败,因为head标记在body标记之前,document.write写入body标记

write
将写入脚本元素所在的任何位置,而不是正文

但是,在本例中,您正在写入文本内容(不能作为head元素的子节点显示)

这将导致head元素结束(end标记是可选的),body开始(start标记是可选的),内容写入body的开头


将被视为无效的HTML,浏览器将尽其通常的努力从作者错误中恢复

您可以在DOM检查器中看到结果:

document.write from head标记是否需要等待window.onload

不,恰恰相反

文档关闭时将触发加载事件。无法写入已关闭的文档,因此调用
write
会隐式调用
open
并删除现有文档

这似乎工作正常,但我想知道它是否会在某些浏览器/计算机上失败,因为head标记在body标记之前,document.write写入body标记

write
将写入脚本元素所在的任何位置,而不是正文

但是,在本例中,您正在写入文本内容(不能作为head元素的子节点显示)

这将导致head元素结束(end标记是可选的),body开始(start标记是可选的),内容写入body的开头


将被视为无效的HTML,浏览器将尽其通常的努力从作者错误中恢复

您可以在DOM检查器中看到结果:


您可以很容易地为此编写一个测试用例,您知道最好的建议是不要使用
文档。编写
。它被认为是过时的和“危险的”,因为它忽略了DOM的概念。您可以很容易地为此制作一个测试用例,您知道最好的建议是不要使用
文档。编写
。它被认为是过时的和“危险的”,因为它忽略了DOM的概念。虽然我同意应该避免使用它,但我有一个我不得不使用它的地方的例子:一个遗留应用程序,其中提供的唯一源代码与生产不匹配(它来自一些不相信“版本控制”之类的东西的牛仔)。在构建替换版本的过程中,我们的任务是在遗留版本的每一页中注入一个脚本(出于某种合规性原因),唯一有效的是一个文档。写吧。这是一件奇怪的事情。当用于同步注入脚本时,Document.write会降低文档加载速度。没有人认为应该使用document.write,它现在在Chrome中标记警告。然而,排名前50位的网站中有10家在其网页中使用它,通常将广告脚本写入标题。为什么?虽然我同意应该避免使用它,但我举了一个我不得不使用它的地方的例子:一个遗留应用程序,其中提供的唯一源代码与生产不匹配(它来自一些不相信“版本控制”之类东西的牛仔)。在构建替换版本的过程中,我们的任务是在遗留版本的每一页中注入一个脚本(出于某种合规性原因),唯一有效的是一个文档。写吧。这是一件奇怪的事情。当用于同步注入脚本时,Document.write会降低文档加载速度。没有人认为应该使用document.write,它现在在Chrome中标记警告。然而,排名前50位的网站中有10家在其网页中使用它,通常将广告脚本写入标题。为什么?头的结束标签和身体的开始标签怎么可以是可选的?如果两者都是可选的,并且都省略了,您如何判断
头部
结束和
身体
开始的位置?一旦插入一个不能出现在头部但可以出现在身体中的节点,就会触发头部的结束和身体的开始。谢谢。顺便说一句,你是怎么学会这个的?我想这不在MDN中。你能找到什么消息来源吗