這取決於你想怎麼早去。在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);
})();
Live Example | Source
然後您手動擴展其他EventTargets,如window
和document
(請參閱上面的代碼清單的末尾)。
原來的答覆:我原來是誤解你的問題是有關添加addEventListener
,具體而言,IE8的,而實際上你的問題是很清楚不有關補充說,但是添加自己的addEvent
。我要離開這個答案在原地其他讀者:
這取決於你想怎麼早去。在IE8,您可以擴展Element.prototype
添加addEventListener
給它,這將通過頁面上的所有HTML元素被使用(見下文)。但是,添加的墊片不能支持捕獲階段,因爲直到他們本機支持addEventListener
時,IE才支持它。我相當肯定你不能在早期版本(IE7,IE6)延長Element.prototype
,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);
});
};
}
})();
Live Example | Source
其實T.J.我最初的意思是我可以包含像IE8腳本這樣的東西(我完全忽略了它之前的版本),然後正常使用'addEventListener'(不需要在IE8中捕獲)。關鍵是避免使用一個獨特的名爲addEvent,而不是基於標準的香草JS。 – juuga