这取决于你想回多远。在 IE8 上,您可以扩展Element.prototype
以向所有 HTML 元素添加功能,这至少是 90% 的工作。我相当肯定你不能在 IE6 中做到这一点(PrototypeJS 不得不求助于扩展单个Element
实例),我不记得 IE7。不过,除非您的目标是东亚市场,否则您基本上可以忽略 IE7 及更早版本。
这是您如何执行此操作的示例:
(function() {
// Functions for IE
function stopPropagation() {
this.cancelBubble = true;
}
function preventDefault() {
this.returnValue = false;
}
function addEventUsingAttach(eventName, handler)
{
this.attachEvent("on" + eventName, function() {
var e = window.event;
e.stopPropagation = stopPropagation;
e.preventDefault = preventDefault;
handler.call(this, e);
});
}
// Function to add `addEvent` to the given target object
function extendIt(target)
{
if (target.addEventListener) {
target.addEvent = Element.prototype.addEventListener;
}
else {
target.addEvent = addEventUsingAttach;
}
}
// Add it to `Element.prototype` if we have it
if (typeof Element !== "undefined" &&
typeof Element.prototype !== "undefined") {
extendIt(Element.prototype);
}
// Add it to `window` and `document` (etc.)
extendIt(window);
extendIt(document);
})();
实例| 资源
然后您手动扩展其他 EventTargets,例如window
和document
(参见上面代码清单的末尾)。
原始答案:我最初误认为您的问题是关于添加addEventListener
,特别是在 IE8 上,而实际上您的问题显然不是添加,而是添加您自己的addEvent
. 我将这个答案留给其他读者:
这取决于你想回多远。在 IE8 上,您可以扩展Element.prototype
以添加addEventListener
到它,页面上的所有 HTML 元素都将使用它(见下文)。但是,您添加的 shim 不支持捕获阶段,因为 IE 在原生支持之前不支持它addEventListener
。我很确定您不能Element.prototype
在早期版本(IE7、IE6)上进行扩展,PrototypeJS 不得不退回到为旧版本的 IE 扩展特定元素。但它适用于IE8。
扩展Element.prototype
后,您必须手动扩展您提到的其他事件目标,但扩展Element.prototype
完成了大部分工作。
但是,如果您这样做并且包含第三方脚本,请注意它们可能会假定addEventListeneer
在捕获阶段完成的正确实现。
addEventListener
这是添加到 IE8的基本填充程序:
(function() {
function stopPropagation() {
this.cancelBubble = true;
}
function preventDefault() {
this.returnValue = false;
}
if (typeof Element !== "undefined" &&
typeof Element.prototype !== "undefined" &&
!Element.prototype.addEventListener) {
Element.prototype.addEventListener = function(eventName, handler, useCapture) {
if (useCapture) {
throw "Browser doesn't support capturing phase";
}
this.attachEvent("on" + eventName, function() {
var e = window.event;
e.stopPropagation = stopPropagation;
e.preventDefault = preventDefault;
handler.call(this, e);
});
};
}
})();
实例| 资源