今天我遇到了一个奇怪的错误。我有一个简单的用户脚本,它向所有网站添加了window.onload
个事件。但其中一个网站定义了<body onload="func();">
。发生的事情是window.onload
正常工作但<body onload="">
在安装用户脚本后停止为网站工作。
当我使用window.body.onload
时,两者都运作良好。我知道window.onload
和<body onload="">
是做同样事情的不同方式,但window.body.onload
中发生了什么使得它与<body onload="">
配合得很好?
答案 0 :(得分:2)
Window.onload和body标签的onload是同一事件。因此,如果您通过两种不同的方法将相同的事件设置两次,那么它将只能得到一个值 - 其中一个函数。
window.body.onload是一个单独的事件。只是DoM的另一个怪癖以及broswers用它做什么。
答案 1 :(得分:1)
正如Myforwik所说,与window.onload = ...;
挂钩的事件与您与<body onload="...">
挂钩的事件相同。这是window
load
事件。这两种挂钩方式都采用旧的DOM0风格,已经过时了一段时间。如果你指定两者,后者将赢,淘汰前者。如果多个脚本独立设置window.onload
,情况也是如此。
要避免这些问题,请使用DOM2样式的事件连接:
if (window.addEventListener) {
// DOM2 standard
window.addEventListener("load", handler, false);
}
else if (window.attachEvent) {
// Microsoft's precursor to it, IE8 and earlier
window.attachEvent("onload", handler);
}
else {
// Some pre-1999 browser
window.onload = handler;
}
function handler() {
}
多个DOM2处理程序可以附加到同一事件,因此多个不相关的脚本可以订阅它。此外,DOM2处理程序很乐意与DOM0处理程序共存。
因此,如果您更新用户脚本以使用上述内容,则<body onload="...">
页面将不受影响。