上面这个在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函数在每个页面都被调用两次......
答案 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);
})()