如果您使用element.onclick = xxx; 样式,您将自己(以及您在页面上使用的任何其他脚本)限制为该元素(任何该事件的前一个处理程序被重击)。使用addEventListener / attachEvent 机制,您可以相互独立地附加和删除事件处理程序,而不会产生串扰。
例如,如果你这样做:
document.getElementById('foo').onclick = function() {
};
...然后元素 foo 上的任何先前的 click 处理程序都会被吹走,并且在单击 foo 时不再调用。相比之下:
document.getElementById('foo').addEventListener('click', function() {
});
现在您的click 处理程序被调用,但是之前已附加到元素的任何其他 click 处理程序也 被调用。你和别人玩得很好。 :-)
创建一个为您解决这些问题的函数很容易:
function hookEvent(element, eventName, handler) {
if (element.attachEvent) {
element.attachEvent("on" + eventName, handler);
}
else if (element.addEventListener) {
element.addEventListener(eventName, handler, false);
}
else {
element["on" + eventName] = handler;
}
}
...或者如果您真的想去镇上:
var hookEvent = (function() {
function hookViaAttach(element, eventName, handler) {
element.attachEvent("on" + eventName, handler);
}
function hookViaAdd(element, eventName, handler) {
element.addEventListener(eventName, handler, false);
}
function hookDOM0(element, eventName, handler) {
element["on" + eventName] = handler;
}
if (document.attachEvent) {
return hookViaAttach;
}
if (document.addEventListener) {
return hookViaAdd;
}
return hookDOM0;
})();
...它创建了一个函数,该函数检测一次要使用哪种处理程序,然后在整个过程中使用它。
但坦率地说,对于这些东西,利用其他人的工作并使用像 jQuery、Prototype、YUI、Closure 或 any of several others 这样的库很有用。