Microsoft Edge在页面加载时调用onload命名函数

old*_*god 0 javascript onload microsoft-edge

在Edge上打开一个像上面这样的简单html会显示警报.

<html>
    <head>
        <script>
        var onload = function() {
            alert('I\'ve been called');
        };
        </script>
    </head>
    <body> my body </body>
</html>
Run Code Online (Sandbox Code Playgroud)

更多,如果你添加window.addEventListener('load', onload, false);到你的代码,函数会被调用两次 ..

我有一个网络应用程序,我的onload函数在每个页面上调用两次...

  1. 有没有办法禁用这个功能,服务器端,所以该功能只会被调用一次,而不需要重构我的所有代码?
  2. 这是一个已知的错误还是我们从现在开始需要考虑的行为?

jfr*_*d00 5

您正在为window.onloadAND 分配一个函数,您正在向窗口加载事件安装事件监听器.您正在将两个事件侦听器连接到同一个函数,因此它被调用两次.

请记住,全局变量也是window对象的所有属性,所以当你这样做时:

var onload = function() {...}
Run Code Online (Sandbox Code Playgroud)

在全局命名空间中,这与执行相同:

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

这是配置事件处理程序.

如果您不想要这个问题,那么将onload函数的名称更改为不与之冲突window.onload的函数或使用匿名函数(这是为什么您应该尽可能使用匿名事件处理程序并避免使用尽可能的全局命名空间).


我会建议:

// anonymous function
window.addEventListener('load', function() {
    alert('I\'ve been called');
}, false);
Run Code Online (Sandbox Code Playgroud)

或这个:

// use IIFE function to insulate from global namespace
(function() {
    var onload = function() {
        alert('I\'ve been called');
    };
    window.addEventListener('load', onload, false);
})();
Run Code Online (Sandbox Code Playgroud)