どこまで戻りたいかによります。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);
})();
実例| ソース
window
次に、やなどの他の EventTarget を手動で拡張します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に追加するための基本的な shim は次のとおりです。
(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);
});
};
}
})();
実例| ソース