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

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


当前回答

使用YUI库(我喜欢它):

YAHOO.util.Event.onDOMReady(function(){
    //your code
});

便携又漂亮!然而,如果你不把YUI用于其他东西(参见它的文档),我会说它不值得使用。

注意:要使用此代码,您需要导入2个脚本

<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/event/event-min.js" ></script>

其他回答

我建议使用asnyc属性的脚本标签,这有助于你加载页面加载后的外部脚本

<script type="text/javascript" src="a.js" async></script>
<script type="text/javascript" src="b.js" async></script>

使用YUI库(我喜欢它):

YAHOO.util.Event.onDOMReady(function(){
    //your code
});

便携又漂亮!然而,如果你不把YUI用于其他东西(参见它的文档),我会说它不值得使用。

注意:要使用此代码,您需要导入2个脚本

<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo/yahoo-min.js" ></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/event/event-min.js" ></script>

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

在合适的时机触发脚本

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脚本是否已完成?

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

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

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