javascript:<车身负载=“">和window.onload

javascript: <body onload=""> and window.onload

本文关键字:gt quot window onload 负载 lt javascript      更新时间:2023-09-26

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

当我使用window.body.onload时,两者效果都很好。我知道window.onload<body onload="">是做同一件事的不同方式,但window.body.onload中发生了什么,使它与<body onload="">一起工作得很好?

Window.onload和body标记的onload是相同的事件。所以,若您用两种不同的方法两次设置同一事件,它最终只会得到一个值——其中一个函数。

window.body.onload是一个单独的事件。这只是DoM的另一个怪癖,以及兄弟们如何处理它。

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