1

クロスブラウザーのイベント処理用に軽量のイベント ユーティリティを作成してきましたが、かなり高いハードルにぶつかりました。それは IE9 の srcElement プロパティに関するものですが、これは私にとってはうまくいきません!

現在、私のユーティリティは次のようになっています (srcElement は 3 番目のコード ブロックです)。

var bonsallNS = new Object();

bonsallNS.events = {
addEvent: function (node, type, func) {
    if (typeof attachEvent != "undefined") {
        node.attachEvent("on" + type, func);
    } else {

        node.addEventListener(type, func, false);
    }
},
removeEvent: function (node, type, func) {
    if (typeof detachEvent != "undefined") {
        node.detachEvent("on" + type, func);
    } else {

        node.removeEventListener(type, func, false);
    }
},
target: function (e) {
    if (typeof srcElement != "undefined") {
        return window.event.srcElement;
    } else {
        return e.target;
    }
},
preventD: function (e) {
    if (typeof srcElement != "undefined") {
        window.event.returnValue = false;
    } else {
        e.preventDefault();
    }
}
}

現在、以下のテスト スクリプトを使用すると、Chrome と Firefox では問題なく動作しますが、IE に警告しようとすると、evtTarget が未定義であることが返されます。理由がわからないので、どんな助けでも大歓迎です!以下のコードを参照してください。

var gClick = document.getElementById("clickme");
var gCount = 0;

function mssg(e){

var evtTarget = bonsallNS.events.target(e);
alert("it worked, target: " + evtTarget);
gCount++
if (gCount > 2){
    bonsallNS.events.removeEvent(gClick, "click", mssg);
}
}

function setUp(){
bonsallNS.events.addEvent(gClick, "click", mssg);
}

bonsallNS.events.addEvent(window, "load", setUp);

私が言うように、IEのイベントソースを除いて、他のすべてが機能します!!

4

1 に答える 1

1

変数は、より高いスコープで定義されていない限り、srcElement常にになります。undefinedしかし、それは決して参照しませんevent.srcElement

この問題は 2 つの方法で解決できます。または が定義されているかどうか、またはとが定義されているかどうeかを確認します。e.srcElementwindow.eventwindow.event.srcElement

if (typeof e === "undefined" || typeof e.srcElement === "undefined") {
// or
if (typeof window.event !== "undefined" && 
    typeof window.event.srcElement !== "undefined") {

関数全体を次のように短縮することもできます。

target: function (e) {
    e = e || window.event;
    return e.target || e.srcElement;
}
于 2013-01-17T20:39:30.157 に答える