代码之家  ›  专栏  ›  技术社区  ›  joe

`函数onload(){}与`window.onload=function(){}`不同——前者不会在页面加载时触发。为什么?

  •  0
  • joe  · 技术社区  · 1 年前

    背景: 我试图以编程方式检测(通过注入的脚本)任意页面(不是我编码的)是否有 window.onload 功能集(通过 window.onload=foo , addEventListener ).

    我想我可以简单地检查一下 typeof window.onload === "function" ,但这是 真的 对于这种情况:

    <script>
      function onload() {
        console.log('onload called'); // this is *not* triggered on page load
      }
    
      typeof window.onload === "function"; // is true
      window.onload === onload; // is`true`
      window.hasOwnProperty("onload"); // is`true`
    </script>
    

    然而,这个功能是 在页面加载过程中自动调用。我已经在最新版本的Chrome和Firefox中进行了测试。

    我认为这相当于:

    <script>
      window.onload = function() {
        console.log('onload called'); // this *is* triggered on page load
      };
    </script>
    

    但事实似乎并非如此。浏览器似乎有一个设置器(或类似的东西),当显式分配时会触发它 window.onload ,与全局变量为 隐含地 可通过窗口对象访问。

    我如何(通过注入的脚本)稳健地检测 任意的 页面有一个实际 window.onload set(我的意思是在页面加载时触发的一个),而不仅仅是一个名为 onload ?

    2 回复  |  直到 1 年前
        1
  •  1
  •   Unmitigated    1 年前

    document.body.onload 是的别名 window.onload .

    因此,应该输出以下内容 false

    function onload() {
      console.log('does not fire on load');
    }
    console.log(window.onload === document.body.onload)

    然而,使用 window.onload = ,应输出以下内容 true (以及console.log onload 处理器

    window.onload = function onload() {
      console.log('does fire on load');
    }
    console.log(window.onload === document.body.onload)
        2
  •  -1
  •   Diego Ferruchelli    1 年前

    在(主要是)“纯”Chrome(只有极少数扩展程序等)上,这是:

    <script>
      console.log (typeof window.onload === "function");
      window.onload = function() {
        console.log('onload called'); // this *is* triggered on page load
      };
      console.log (typeof window.onload === "function");
    </script>
    

    显示如下:

    false
    true
    onload called
    

    这个 "onload called" 在整个脚本运行完毕且页面已加载后出现,这是正常的。对我来说,比较效果很好,可以检测到 window.onload() 存在。