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

时间:2015-08-13 06:01:46

标签: javascript onload microsoft-edge

上面这个在Edge上打开的简单html会显示警告。

<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. 这是一个已知的错误或我们现在需要考虑的行为吗?

3 个答案:

答案 0 :(得分:5)

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

请记住,当您执行以下操作时,全局变量也是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);
})();

答案 1 :(得分:2)

没有任何与微软边缘相关的东西。它只是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

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

答案 2 :(得分:1)

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

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