1

私が継承した非常に見栄えの悪いイベントバインディングラッパーがありますが、その理論的根拠は私にはわかりません。attachEvent私が知っているのは、それを使用するプラグインの IE 実装が、 jQuery を介してシンプルまたはエイリアスに置き換えようとすると壊れるということだけです。 .

function AddEvent(obj, type, fn) {
    if (obj.attachEvent) {
        obj['e' + type + fn] = fn;
        obj[type + fn] = function() {
            obj['e' + type + fn](window.event);
        };
        obj.attachEvent('on' + type, obj[type + fn]);
    }
    else {
        obj.addEventListener(type, fn, false);
    }
};

イベント フックの名前が付けられた HTML 属性または DOM プロパティに関数を直接アタッチする非常に基本的な方法はよく知っていますが、これはかなり面倒に見えます。何が起こっているのかについての私の解釈は次のとおりです。

eイベント フック ラベルと文字列型強制関数 (!?) で構成される、プレフィックス付きの文字列を作成します。問題の要素にその名前のプロパティを作成し、それに関数を割り当てます。

obj['e' + type + fn] = fn;

接頭辞のない同じ文字列は、要素の別のプロパティになり、関数を呼び出します。この関数は、渡された元の関数を (何らかの理由で、定義したばかりのエイリアスを使用して)window.event引数として実行します。

obj[type + fn] = function() {
    obj['e' + type + fn](window.event);
};

最後に、attachEventメソッドを使用して前の関数をイベント フックにバインドします。

obj.attachEvent('on' + type, obj[type + fn]);
4

1 に答える 1

1

おそらく次のように置き換えることができます:

function AddEvent(obj, type, fn) {
    if (obj.attachEvent) {
        obj.attachEvent('on' + type, function (event) {
            return fn(event || window.event);
        });
    }
    else {
        obj.addEventListener(type, fn, false);
    }
};

obj2 つの非常に奇妙なプロパティ名の汚染に依存しない限り。

于 2013-02-27T17:57:27.210 に答える