javascript:和window.onload

时间:2012-01-12 08:47:24

标签: javascript onload-event

今天我遇到了一个奇怪的错误。我有一个简单的用户脚本,它向所有网站添加了window.onload个事件。但其中一个网站定义了<body onload="func();">。发生的事情是window.onload正常工作但<body onload="">在安装用户脚本后停止为网站工作。

当我使用window.body.onload时,两者都运作良好。我知道window.onload<body onload="">是做同样事情的不同方式,但window.body.onload中发生了什么使得它与<body onload="">配合得很好?

2 个答案:

答案 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="...">页面将不受影响。