【问题标题】:When to use "window.onload"?何时使用“window.onload”?
【发布时间】:2013-12-09 10:08:08
【问题描述】:

在 JavaScript 中,当我想在页面加载后运行一次脚本时,我应该使用 window.onload 还是只编写脚本?

例如,如果我想有一个弹出窗口,我应该写(直接在<script>标签内):

alert("hello!");

或者:

window.onload = function() {
    alert("hello!");
}

两者似乎都在页面加载后立即运行。有什么区别?

【问题讨论】:

    标签: javascript onload onload-event


    【解决方案1】:

    其他答案似乎都过时了

    首先,将脚本放在顶部并使用window.onload 是一种反模式。它充其量是 IE 时代遗留下来的,或者最糟糕的是对 JavaScript 和浏览器的误解。

    您可以将脚本移动到 html 的底部

    <html>
      <head>
       <title>My Page</title>
      </head> 
      <body>
        content
      </body>
      <script src="some-external.js"></script>
      <script>
        some in page code
      </script>
    </html>
    

    人们使用window.onload 的唯一原因是他们错误地认为脚本需要放在head 部分。因为如果你的脚本在 head 部分,那么事情是按顺序执行的,那么根据 按顺序执行的定义,正文和你的内容还不存在。

    解决方法是使用 window.onload 等待页面的其余部分加载。将脚本移至底部也解决了该问题,现在无需使用window.onload,因为您的正文和内容已经加载完毕。

    更现代的解决方案是在您的脚本上使用defer 标签,但要使用该标签,您的脚本需要全部是外部的。

    <head>
        <script src="some-external.js" defer></script>
        <script src="some-other-external.js" defer></script>
    </head>
    

    这样做的好处是浏览器将立即开始下载脚本并按照指定的顺序执行它们,但它会等到页面加载后才执行它们,不需要window.onload或更好但仍然不需要window.addEventListener('load', ...

    【讨论】:

    • 哇,这个问题太老了!感谢您提供有关defer 的提示。我见过它,但从未意识到它的含义。
    • 是的,这是谷歌搜索何时使用window.onload 时的第一个结果,所以它似乎需要一个更新的答案
    • 为什么 window.addEventListener 更好?你会像 window.onload 那样说,这是人们使用 window.addEventListener('load',...) 的唯一原因。这是不必要的,是因为他们不知道您可以将脚本放在正文的末尾吗?
    • addEventListener 比 onload 更好,因为多个脚本可以使用它。只有一个脚本 csn 使用 onload。 Defer 是最好的,只是它不受旧浏览器的支持。因此,您可以将 defer 与 addEventListener 一起使用,它会在新浏览器中加载速度最快,但在旧浏览器中仍会加载。
    • 只有我不喜欢页面末尾的脚本外观吗?当然,使用 defer 标签引用外部脚本很漂亮,但有时您只想在页面中放一点脚本(在顶部,dag nab !),这意味着添加事件侦听器(或回退到window.onload,恕我直言,即使有其局限性也非常简单)仍然是必要的,所以[旧]问题仍然有效。
    【解决方案2】:

    window.onload 只是在浏览器访问它时运行。

    window.addEventListener 在运行之前等待窗口加载。

    通常你应该做第二个,但你应该给它附加一个事件监听器而不是定义函数。例如:

    window.addEventListener('load', 
      function() { 
        alert('hello!');
      }, false);
    

    【讨论】:

      【解决方案3】:

      这是documentation on MDN

      据此:

      加载事件在文档加载过程结束时触发。至此,文档中的所有对象都在DOM中,所有图片和子帧都加载完毕了。

      只要浏览器在 HTML 中点击该位置,您的第一个 sn-p 代码就会运行。

      第二个 sn-p 将在 DOM 和所有图像完全加载时触发弹出窗口(请参阅规范)。

      考虑到alert() 函数,它在什么时候运行并不重要(它不依赖于window 对象之外的任何东西)。但是如果你想操纵DOM - 你绝对应该等待它正确加载。

      【讨论】:

      【解决方案4】:

      这取决于您是否希望它在遇到脚本元素时运行,或者您是否希望它在加载事件触发时运行(即在整个文档(包括图像等内容)加载之后)。

      两者都不对。

      不过,一般来说,我会避免将函数直接分配给onload,而是使用addEventListener(如果我需要支持旧版浏览器,请使用兼容性库)。

      【讨论】:

      • 你写“但是,一般来说,我会避免将函数直接分配给 onload,而是使用 addEventListener”
      【解决方案5】:

      等待 DOM 加载的原因是您可以定位在脚本之后加载的任何元素。如果您只是创建一个alert,那没关系。但是,假设您的目标是 div,它位于您的脚本之后的标记中,如果您不等到 DOM 树的那部分加载,您会收到错误。

      如果您使用 jQuery,document.readywindow.onload 的绝佳替代品。

      请看这里:window.onload vs $(document).ready()

      【讨论】:

        【解决方案6】:

        你有三个选择:

        1. 直接在脚本标签内一解析就运行。

        2. 一旦 DOM 准备就绪,document.addEventListener( "DOMContentLoaded", function(){}); 内部就会运行它。

        3. 一旦加载所有页面资源,window.onload function(){}) 内部就会运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-08
          • 2010-10-27
          • 1970-01-01
          • 2012-02-08
          • 2013-09-07
          • 2010-10-09
          相关资源
          最近更新 更多