3

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

当我window.body.onload改为使用时,两者都运作良好。我知道这一点,window.onload并且<body onload="">以不同的方式做同样的事情,但是发生了什么window.body.onload使它可以很好地工作<body onload="">

4

2 回答 2

2

Window.onload 和 body 标签的 onload 是同一个事件。因此,如果您通过两种不同的方法两次设置相同的事件,它只会以一个值结束 - 其中一个函数。

window.body.onload 是一个单独的事件。只是 DoM 的另一个怪癖以及浏览器如何处理它。

于 2012-01-12T08:53:02.117 回答
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="...">页面将不受影响。

于 2012-01-12T09:01:41.820 回答