页面加载后执行的JavaScript

Rob*_*cks 666 html javascript pageload dom-events

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

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

mar*_*cgg 759

这些解决方案将有效:

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

要么

document.onload = function ...
Run Code Online (Sandbox Code Playgroud)

甚至

window.onload = function ...
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个选项是更好的方法,因为它是不显眼的,被认为是更标准的.

  • @gerdi OP没有提到有关jQuery的任何内容.在我的回答中,我也提出了一个不引人注目的选择. (18认同)
  • @mentoliptus:`document.onload =`非突兀http://en.wikipedia.org/wiki/Unobtrusive_JavaScript (11认同)
  • document.onload 对我不起作用。我发现这篇文章有同样的问题 /sf/ask/359494691/。似乎 document.onload 不是一个选项。 (6认同)
  • <body onload ="script();">和document.onload = function ...之间有什么区别? (5认同)
  • 考虑到在 DOM 准备好被操纵后运行 javascript 的目标,*所有*这些选项都比必要的要晚得多。实现该目标的两个更好的选择:1) 在头部的 javascript 链接上使用 `defer` 属性。2) 将任何访问 DOM 的 javascript 移动到页面底部,紧接在 `&lt;/body&gt;` 之前。 (3认同)
  • html中的脚本... no no no $(function(){code here}); < - javascript.js可以置于头部并在DOM之后加载 (2认同)
  • 在我看来,使用 onload 函数是一种不好的风格,因为它只引用最后分配的函数。看看DevWL的答案/sf/answers/2526760001/。 (2认同)

cha*_*aos 189

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1几乎完全是我6个月前发布的内容.如果您无法控制的其他框架和代码添加onload事件并且您希望在不消除其他onload事件的情况下,则可能需要这样的代码.我将我的实现作为一个函数包含在内,它需要var newonload = function(evt){curronload(evt); newOnload(EVT); 因为某些原因我使用的框架需要将事件传递给onload事件. (9认同)
  • 我刚刚在测试中发现,当使用attachEvent()附加时,写入的代码导致处理程序以未定义的顺序触发.如果处理程序执行顺序很重要,您可能希望省略window.attachEvent分支. (5认同)
  • 很好的解决方案,但现在已经过时:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/attachEvent (2认同)

Dev*_*vWL 145

请记住,加载页面有多个阶段.顺便说一下,这是纯粹的JavaScript

"DOMContentLoaded"

初始HTML文档完全加载和解析后,无需等待样式表,图像和子帧完成加载,就会触发此事件.在此阶段,您可以基于用户设备或带宽速度以编程方式优化图像和css的加载.

加载DOM后的异常(在img和css之前):

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

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

"加载"

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

加载和解析所有内容后的Exectues:

window.addEventListener("load", function(){
    // ....
});
Run Code Online (Sandbox Code Playgroud)

MDN资源:

自由软件开发人员 htt

所有活动的MDN列表:

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

  • 关于*异步 javascript*:澄清一下,对于不立即运行的脚本有两种选择。其中,**defer** 通常优于 **async** - 因为 *defer* 不会中断 html 解析/渲染 - 并且当它运行时,保证 DOM 已准备就绪。[使用 defer 和 async 高效加载 JavaScript](https://flaviocopes.com/javascript-async-defer/#blocking-rendering)。 (4认同)
  • @Peter 很确定,如果它位于 javascript 文件的底部,那么它可能是最好的,所以它最后执行 (2认同)
  • 这是最完整的答案。onload 是在之后,但人们一开始并没有意识到这一点。 (2认同)
  • +1我尝试了`window.onload = ...`,认为我的脚本会等到所有内容完全下载后再运行,但看起来`window.onload`实际上的行为类似于`document.addEventListener("DOMContentLoaded", ...` ,而 `window.addEventListener("load", ...` 确实会等待所有内容完全下载。我本以为 `window.onload` 应该等同于 `window.addEventListener("load", 。 ..` 而不是 `document.addEventListener("DOMContentLoaded", ...` ?? 我在 Chrome 和 FF 中得到了相同的结果。 (2认同)

Nor*_*des 116

您可以在正文中放置"onload"属性

...<body onload="myFunction()">...
Run Code Online (Sandbox Code Playgroud)

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

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

or 

$(window).load(function(){ /*code here*/ })
Run Code Online (Sandbox Code Playgroud)

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

请注意,$(窗口).load将在页面上呈现文档后执行.


Dan*_*ice 58

如果脚本是在<head>文档中加载的,那么可以defer在脚本标记中使用该属性.

例:

<script src="demo_defer.js" defer></script>
Run Code Online (Sandbox Code Playgroud)

来自https://developer.mozilla.org:

延缓

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

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

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

  • @Akansh OP 只是想要一种方法来确保 DOM 在脚本执行之前已加载。Defer 就是这样做的,它确实写在我在答案中共享的文档片段中。 (2认同)

Luc*_*cky 25

这是一个基于加载页面后延迟js加载的脚本,

<script type="text/javascript">
  function downloadJSAtOnload() {
      var element = document.createElement("script");
      element.src = "deferredfunctions.js";
      document.body.appendChild(element);
  }

  if (window.addEventListener)
      window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
      window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>
Run Code Online (Sandbox Code Playgroud)

我在哪里放这个?

</body>标记之前(HTML文件底部附近)粘贴HTML中的代码.

它有什么作用?

此代码表示等待整个文档加载,然后加载外部文件deferredfunctions.js.

这是上面代码的一个例子 - 推迟JS的渲染

我写了这个基于deavascript加载的javascript pagespeed google概念,也来源于本文推迟加载javascript


Dan*_*ite 19

看看挂钩document.onload或jQuery $(document).load(...).

  • 它实际上是window.onload,它更标准,而不是document.onload.据我所知 (16认同)

T.T*_*dua 18

JavaScript

document.addEventListener('readystatechange', event => { 

    // When HTML/DOM elements are ready:
    if (event.target.readyState === "interactive") {   //does same as:  ..addEventListener("DOMContentLoaded"..
        alert("hi 1");
    }

    // When window loaded ( external resources are loaded too- `css`,`src`, etc...) 
    if (event.target.readyState === "complete") {
        alert("hi 2");
    }
});
Run Code Online (Sandbox Code Playgroud)

jQuery 也一样:

$(document).ready(function() {   //same as: $(function() { 
     alert("hi 1");
});

$(window).load(function() {
     alert("hi 2");
});
Run Code Online (Sandbox Code Playgroud)





注意: - 不要使用以下标记(因为它会覆盖其他同类声明):

document.onreadystatechange = ...
Run Code Online (Sandbox Code Playgroud)


Aam*_*zad 10

工作小提琴

<!DOCTYPE html>
<html>
<head>
<script>
function myFunction()
{
   alert("Page is loaded");
}
</script>
</head>

<body onload="myFunction()">
<h1>Hello World!</h1>
</body>    
</html>
Run Code Online (Sandbox Code Playgroud)


Fra*_*key 8

最好的方法,谷歌也推荐.:)

<script type="text/javascript">
  function downloadJSAtOnload() {
   var element = document.createElement("script");
   element.src = "defer.js";
   document.body.appendChild(element);
  }
  if (window.addEventListener)
   window.addEventListener("load", downloadJSAtOnload, false);
  else if (window.attachEvent)
   window.attachEvent("onload", downloadJSAtOnload);
  else window.onload = downloadJSAtOnload;
</script>
Run Code Online (Sandbox Code Playgroud)

http://www.feedthebot.com/pagespeed/defer-loading-javascript.html


Art*_*hur 7

document.onreadystatechange = function(){
     if(document.readyState === 'complete'){
         /*code here*/
     }
}
Run Code Online (Sandbox Code Playgroud)

看这里:http://msdn.microsoft.com/en-us/library/ie/ms536957(v = vs.85).aspx

  • one-line:document.onload = function(){...} (2认同)

Ben*_*ier 6

如果你使用的是jQuery,

$(function() {...});

相当于

$(document).ready(function () { })

请参阅JQuery $ function()触发什么事件?


Cha*_*met 6

我有时发现在更复杂的页面上,并非所有的元素都在window.onload被触发时加载。如果是这种情况,请在函数延迟之前添加setTimeout。它不是很优雅,但是可以很好地渲染它。

window.onload = function(){ doSomethingCool(); };
Run Code Online (Sandbox Code Playgroud)

变成...

window.onload = function(){ setTimeout( function(){ doSomethingCool(); }, 1000); };
Run Code Online (Sandbox Code Playgroud)


Nor*_*rtl 5

只需定义<body onload="aFunction()">在页面加载后将调用的方法即可。然后,脚本中的代码将用括起来aFunction() { }