页面完全加载后如何执行功能?

Ben*_*ock 273 javascript

我需要在页面完全加载时执行一些JavaScript代码.这包括像图像之类的东西.

我知道你可以检查DOM是否准备就绪,但我不知道这是否与页面完全加载时相同.

Mat*_*chu 382

这叫做onload.在DOM准备就绪之前,它已经过了waaaaay,并且实际上已经创建了DOM就绪,因为onload等待图像.

window.addEventListener('load', function () {
  alert("It's loaded!")
})
Run Code Online (Sandbox Code Playgroud)

  • 更好的方法是`addEventListener("load",function(){`...`})`而不是覆盖`onload`属性. (26认同)
  • @BreakPhreak:是:)`onload`等待文档中的所有资源.当然,这排除了动态创建的请求,这些请求不是文档本身的一部分,例如,AJAX请求. (18认同)
  • 所以,只是为了澄清(如果可能的话),与DOM ready相比,当*every*page component/resourse(即*包括*images)时调用`window.onload`.我对吗? (3认同)
  • 脚本未完全加载 (3认同)
  • 如果我的脚本可以动态加载并且在添加处理程序之前发生“加载”事件怎么办? (3认同)
  • 包括框架? (2认同)

geo*_*car 30

通常您可以使用window.onload,但您可能会注意到window.onload使用后退/前进历史记录按钮时最近的浏览器不会触发.

有些人建议使用奇怪的扭曲来解决这个问题,但实际上如果你只是制作一个window.onunload处理程序(即使没有做任何事情),这种缓存行为将在所有浏览器中被禁用.该MDC文件这个"功能"相当不错,但由于某些原因仍有人使用setInterval和其他怪异的黑客.

某些版本的Opera有一个可以通过在页面中的某处添加以下内容来解决的错误:

<script>history.navigationMode = 'compatible';</script>
Run Code Online (Sandbox Code Playgroud)

如果你只想尝试每个视图调用一次javascript函数(并不一定在DOM加载完成后),你可以这样做:

<img src="javascript:location.href='javascript:yourFunction();';">
Run Code Online (Sandbox Code Playgroud)

例如,我使用此技巧将一个非常大的文件预加载到加载屏幕上的缓存中:

<img src="bigfile"
onload="this.location.href='javascript:location.href=\'javascript:doredir();\';';doredir();">
Run Code Online (Sandbox Code Playgroud)


mur*_*urb 16

为了完整起见,您可能还希望将其绑定到DOMContentLoaded,现在广泛支持DOMContentLoaded

document.addEventListener("DOMContentLoaded", function(event){
  // your code here
});
Run Code Online (Sandbox Code Playgroud)

更多信息:https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded

  • 这个答案恰恰与问题中的问题相反. (6认同)
  • 事实上,DOMContentLoaded 事件会在所有 DOM 内容加载完毕后,在加载所有依赖项之前触发。由于答案线程中的用户引用了`$.ready`,我认为它做出了很好的贡献。顺便提一句。不过,我也会将 `addEventListener` 方法用于 `load` 事件,因为它允许您有多个回调: `window.addEventListener("load", function(event){ // 你的代码在这里 }); ` (2认同)

abs*_*ive 15

试试这只在整页加载后运行

通过Javascript

window.onload = function(){
    // code goes here
};
Run Code Online (Sandbox Code Playgroud)

由Jquery

$(window).bind("load", function() {
    // code goes here
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么在jQuery可用时不简单地使用$(document).ready();`? (2认同)

cod*_*fly 8

window.onload事件将在加载所有内容时触发,包括图像等.

如果您希望尽早执行js代码,则需要检查DOM就绪状态,但仍需要访问DOM元素.


Jac*_*son 8

试试这个代码

document.onreadystatechange = function () {
  if (document.readyState == "interactive") {
    initApplication();
  }
}
Run Code Online (Sandbox Code Playgroud)

访问https://developer.mozilla.org/en-US/docs/DOM/document.readyState了解更多详情

  • “交互式”未完全加载。`"complete"` 已完全加载 (4认同)

Def*_*sko 8

使用该onLoad()事件的Javascript ,将在执行前等待页面加载.

<body onload="somecode();" >
Run Code Online (Sandbox Code Playgroud)

如果您正在使用jQuery框架的文档就绪函数,则在加载DOM之后和加载页面内容之前,代码将立即加载:

$(document).ready(function() {
    // jQuery code goes here
});
Run Code Online (Sandbox Code Playgroud)


Mar*_*ski 7

您可能希望使用window.onload,因为文档表明在DOM已准备就绪并且页面中的所有其他资源(图像等)都已加载之前,它不会被触发.


Pou*_*avi 5

在使用现代 javascript (>= 2015) 的现代浏览器中,您可以添加type="module"到脚本标记中,并且该脚本中的所有内容都将在整个页面加载后执行。例如:

<script type="module">
  alert("runs after") // Whole page loads before this line execute
</script>
<script>
  alert("runs before")
</script>
Run Code Online (Sandbox Code Playgroud)

旧的浏览器也会理解nomodule属性。像这样的东西:

<script nomodule>
  alert("tuns after")
</script>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以访问javascript.info