我正在执行一个外部脚本,使用<脚本>内<头>。

现在,由于脚本在页面加载之前执行,我不能访问<body>等。我想在文档被“加载”(HTML完全下载并在ram中)后执行一些JavaScript。是否有任何事件,我可以挂钩到当我的脚本执行,这将在页面加载触发?


当前回答

我可以通过这段代码捕获页面加载

<script>
console.log("logger saber");

window.onload = (event) => {
  console.log('page is fully loaded');
document.getElementById("tafahomNameId_78ec7c44-beab-40de-9326-095f474519f4_$LookupField").value = 1;;
};

</script>

其他回答

$(window).on("load", function(){ ... });

.ready()最适合我。

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

.load()将工作,但它不会等到页面加载。

jQuery(window).load(function () { ... });

对我不起作用,破坏了下一个内联脚本。我也使用jQuery 3.2.1以及一些其他的jQuery叉子。

隐藏我的网站加载覆盖,我使用以下:

<script>
$(window).on("load", function(){
$('.loading-page').delay(3000).fadeOut(250);
});
</script>

< script type = " text / javascript " > 美元(窗口)。绑定("load", function() { // javascript事件 }); > < /脚本

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");
    }
});

jQuery也一样:

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

$(window).load(function() {
     alert("hi 2");
});


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

document.onreadystatechange = ...

这是一个基于延迟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>

我该把它放在哪里?

将代码粘贴到</body>标记之前(靠近HTML文件的底部)。

它能做什么?

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

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

我写这个基于延迟加载javascript页面速度谷歌的概念,也从这篇文章延迟加载javascript

在合适的时机触发脚本

A quick overview on how to load / run the script at the moment in which they intend to be loaded / executed.

使用“推迟”

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

使用defer将触发domInteractive (document. doc .)readyState = "interactive"),就在"DOMContentLoaded"事件触发之前。如果你需要在所有资源(图像,脚本)加载后执行脚本,请使用“load”事件或目标文档之一。请求状态。继续往下阅读,了解有关这些事件/状态的更多信息,以及与脚本获取和执行计时相对应的async和defer属性。

此布尔属性被设置为向浏览器指示脚本 意味着在解析文档之后执行,但在解析之前 发射DOMContentLoaded。内 带有defer属性的脚本将阻止DOMContentLoaded 事件,直到脚本加载并完成求值。

资源:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script属性

*请参阅底部的图片以了解羽毛的解释。

事件监听器-请记住页面的加载有多个事件:

“DOMContentLoaded”

当初始HTML文档完全加载和解析完毕时,无需等待样式表、图像和子帧完成加载,就会触发此事件。在这个阶段,您可以基于用户设备或带宽速度以编程方式优化图像和CSS的加载。 DOM加载后执行(在图像和CSS之前):

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

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

“负载”

A very different event, **load**, should only be used to detect a *fully-loaded page*. It is an incredibly popular mistake to use load where DOMContentLoaded would be much more appropriate, so be cautious.

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

document.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

事件监听器与readyStates -替代解决方案(readystatechange):

You can also track document.readystatechange states to trigger script execution.
// Place in header (do not use async or defer)
document.addEventListener('readystatechange', event => {
  switch (document.readyState) {
    case "loading":
      console.log("document.readyState: ", document.readyState,
       `- The document is still loading.`
       );
      break;
    case "interactive":
      console.log("document.readyState: ", document.readyState, 
        `- The document has finished loading DOM. `,
        `- "DOMContentLoaded" event`
        );
      break;
    case "complete":
      console.log("document.readyState: ", document.readyState, 
        `- The page DOM with Sub-resources are now fully loaded. `,
        `- "load" event`
        );
      break;
  }
});

MDN资源:https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState

在哪里放置你的脚本(有&没有异步/延迟)?

This is also very important to know where to place your script and how it positions in HTML as well as parameters like defer and async will affects script fetching, execution and HTML blocking.

* On the image below the yellow label “Ready” indicates the moment of ending loading HTML DOM. Then it fires: document.readyState = "interactive" >>> defered scripts >>> DOMContentLoaded event (it's sequential);

如果你的脚本使用async或defer,请阅读:https://flaviocopes.com/javascript-async-defer/

如果以上几点都还为时过早……

如果你需要你的脚本在其他脚本运行之后运行,包括那些计划在最后运行的脚本(例如,那些计划在“load”事件中运行的脚本),该怎么办?参见“运行JavaScript”窗口。Onload脚本是否已完成?

如果您需要确保您的脚本在其他脚本之后运行,而不管它何时运行,该怎么办?以上问题的答案也涵盖了这一点。