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

Microsoft Edge calling onload named function on page loading

像上面这样的简单 html,在 Edge 上打开,会显示警报。

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

此外,如果您将 window.addEventListener('load', onload, false); 添加到您的代码中,该函数将被调用 两次 ..

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

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

您正在为 window.onload 分配一个函数,并且正在为 window 加载事件安装一个事件侦听器。您将两个事件侦听器连接到同一个函数,因此它被调用了两次。

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

var onload = function() {...}

在全局命名空间中,这等同于:

window.onload = function() {...}

正在配置事件处理程序。

如果您不希望出现此问题,请将 onload 函数的名称更改为与 window.onload 不冲突的名称或使用匿名函数(这是一个很好的示例为什么应该尽可能使用匿名事件处理程序并尽可能避免使用全局命名空间)。


我建议这样做:

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

或者这个:

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

无法禁用此功能。避免像那样污染全局命名空间,只需将您的函数包装在 IIFE 中即可。它将有助于垃圾收集以及其他场景。

(function(){
    var onload = function() {
        alert('I\'ve been called');
    };
    window.addEventListener('load', onload, false);
})()

没有与 Microsoft Edge 相关的内容。只是 ES6 被实现到边缘,还没有在其他浏览器中实现。这不是错误,这是一个功能。

因此,您的代码将在几周内在 chrome、firefox 中破解。
https://thechamplord.wordpress.com/2014/07/04/using-javascript-window-onload-event-properly/
https://msdn.microsoft.com/en-us/library/cc197055%28v=vs.85%29.aspx

另外,为什么要给一个函数取这样的名字?