如何在页面加载后执行 JavaScript?

IT技术 javascript html dom dom-events pageload
2021-01-28 21:18:33

我正在执行一个外部脚本,使用<script>内部<head>.

现在,由于脚本页面加载之前执行,因此我无法访问<body>. 我想在“加载”文档(HTML 完全下载并在 RAM 中)后执行一些 JavaScript。当我的脚本执行时,是否有任何我可以挂钩的事件,这些事件会在页面加载时触发?

6个回答

这些解决方案将起作用:

如评论中所述,使用defer

<script src="deferMe.js" defer></script>

或者

<body onload="script();">

或者

document.onload = function ...

甚至

window.onload = function ...

请注意,最后一个选项是一种更好的方法,因为它不引人注目并且被认为更标准

<body onload="script();"> 和 document.onload=function ... 有什么区别?
2021-03-13 21:18:33
@mentoliptus:document.onload=不引人注目 en.wikipedia.org/wiki/Unobtrusive_JavaScript
2021-03-24 21:18:33
document.onload 对我不起作用。我发现这篇文章也有同样的问题stackoverflow.com/questions/5135638 /... 似乎 document.onload 不是一个选项。
2021-03-26 21:18:33
所有这些选项都比必要的得多,因为一旦 DOM 准备好操作,就运行 javascript。实现该目标的两个更好的选择:1)defer在头部的 javascript 链接上使用属性。2) 将任何访问 DOM 的 javascript 移动到页面底部,紧接在</body>.
2021-03-30 21:18:33
@gerdi OP 没有提到任何关于 jQuery 的内容。我还在回答中给出了一个不显眼的选项。
2021-04-03 21:18:33

请记住,加载页面有多个阶段。顺便说一句,这是纯 JavaScript

“DOMContentLoaded”

初始 HTML 文档完全加载并解析完毕,无需等待样式表、图像和子框架加载完成时,将触发此事件在此阶段,您可以根据用户设备或带宽速度以编程方式优化图像和 CSS 的加载。

在加载 DOM 之后(在图像和 CSS 之前)执行:

document.addEventListener("DOMContentLoaded", function(){
    //....
});

注意:同步 JavaScript 会暂停解析 DOM。如果您希望在用户请求页面后尽快解析 DOM,您可以将 JavaScript设为异步优化样式表的加载

“加载”

一个非常不同的事件load应该只用于检测完全加载的页面在 DOMContentLoaded 更合适的地方使用 load 是一个非常流行的错误,所以要小心。

在加载和解析所有内容后执行:

window.addEventListener("load", function(){
    // ....
});

MDN 资源:

https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded https://developer.mozilla.org/en-US/docs/Web/Events/load

所有事件的 MDN 列表:

https://developer.mozilla.org/en-US/docs/Web/Events

Javascript 暂停 DOM 的渲染,最好的方法是将它放在页面底部或在标题中加载 javascript async。
2021-03-09 21:18:33
+1 我试着window.onload = ...认为我的脚本会等到所有内容都完全下载后再运行,但window.onload实际上它的行为类似于document.addEventListener("DOMContentLoaded", ...,而window.addEventListener("load", ...实际上确实会等待所有内容完全下载。我会认为这window.onload应该相当于window.addEventListener("load", ...而不是document.addEventListener("DOMContentLoaded", ...?? 我在 Chrome 和 FF 中得到了相同的结果。
2021-03-15 21:18:33
Re asynchronous javascript:澄清一下,对于不立即运行的脚本有两种选择。其中,defer通常比async更可取——因为defer不会中断 html 解析/渲染——并且当它运行时,DOM 保证准备就绪。使用 defer 和 async 高效加载 JavaScript
2021-03-31 21:18:33
@Peter 很确定这可能是最好的,如果它在你的 javascript 文件的底部,所以它最后执行
2021-04-01 21:18:33
这是最完整的答案。onload 是在之后,但人们一开始并没有意识到这一点。
2021-04-06 21:18:33

让您的脚本设置一个在加载时运行的函数的合理可移植的非框架方式:

if(window.attachEvent) {
    window.attachEvent('onload', yourFunctionName);
} else {
    if(window.onload) {
        var curronload = window.onload;
        var newonload = function(evt) {
            curronload(evt);
            yourFunctionName(evt);
        };
        window.onload = newonload;
    } else {
        window.onload = yourFunctionName;
    }
}
+1 发布几乎完全是我 6 个月前必须提出的内容。如果您无法控制的其他框架和代码正在添加 onload 事件,并且您也希望在不清除其他 onload 事件的情况下,这样的代码可能是必要的。我将我的实现包含为一个函数,它需要 var newonload = function(evt) { curronload(evt); newOnload(evt); 因为出于某种原因,我使用的框架需要将事件传递给 onload 事件。
2021-03-19 21:18:33
很好的解决方案,但现在已经过时了:developer.mozilla.org/en-US/docs/Web/API/EventTarget/...
2021-03-19 21:18:33
我刚刚在测试中发现,当使用 attachEvent() 附加时,编写的代码会导致处理程序以未定义的顺序被触发。如果处理程序执行顺序很重要,您可能希望忽略 window.attachEvent 分支。
2021-03-27 21:18:33
所以这会将这个函数添加为一个额外的函数来运行 OnLoad,对吗?(而不是替换现有的 onload 事件)
2021-03-28 21:18:33
@ClayNichols:正确。
2021-03-31 21:18:33

您可以在正文中放置一个“onload”属性

...<body onload="myFunction()">...

或者,如果您使用的是 jQuery,则可以这样做

$(document).ready(function(){ /*code here*/ }) 

or 

$(window).load(function(){ /*code here*/ })

我希望它能回答你的问题。

请注意,$(window).load 将在文档呈现在您的页面上后执行。

如果脚本<head>在文档中加载,则可以使用deferscript 标签中属性。

例子:

<script src="demo_defer.js" defer></script>

来自https://developer.mozilla.org

推迟

此布尔属性设置为向浏览器指示脚本将在解析文档之后执行,但在触发 DOMContentLoaded 之前执行。

如果 src 属性不存在(即对于内联脚本),则不得使用此属性,在这种情况下它将不起作用。

要为动态插入的脚本实现类似的效果,请改用 async=false。具有 defer 属性的脚本将按照它们在文档中出现的顺序执行。

我喜欢这个解决方案,因为不需要任何 javascript 代码,但只需要一个 html 属性 <3
2021-03-12 21:18:33
@Akansh OP 只是想要一种方法来确保 DOM 在脚本执行之前已加载。Defer 是这样做的,它确实写在我在回答中分享的文档片段中。
2021-03-22 21:18:33
这从根本上是错误的。Defer 不会阻止执行 post 页面 onload。defer 和 async 脚本都是在页面加载之前加载的,而是改进了“domInteraction”时间。
2021-03-24 21:18:33
看起来您可以在页面加载后使用 async false 加载内联脚本?“要为动态插入的脚本实现类似的效果,请改用 async=false。- 此布尔属性设置为向浏览器指示该脚本将在文档被解析之后执行,但在触发 DOMContentLoaded 之前。”
2021-03-28 21:18:33