3

重複の可能性:
attachEventを使用して呼び出し元オブジェクト(「this」)を参照する方法

これは完全な重複ではありません。想定される複製と比較して、以下の私の答えを参照してください!

専門用語がかなりずれている可能性がありますので、お気軽に訂正してください。おそらくこれが私が関連するものを見つけることができないように見える理由です。ライブラリはありませ

コールバック関数を呼び出すイベントハンドラーがあります。ファンシーでしょ?IE <9thisでは、ハンドラーのオブジェクトはウィンドウです。理由や、正しいオブジェクトにアクセスする方法がわかりません。

if (document.addEventListener){
    element.addEventListener(event, callback, false);
} else {
    element.attachEvent('on' +event, callback);
}

この部分は機能します。

この部分はしません:

function callback(event){
    console.log(this);
}

thisIEではが返されますが、他のすべてのブラウザで関数[object Window]を呼び出した要素が返されます。callbackこれは私の完全なスクリプトから大幅に削減されていますが、これは関連するすべてのものであるはずです。

編集

@metadingsによって提供されるこのリンクattachEvent を使用して呼び出し元オブジェクト( "this")を参照する方法は非常に近いです。ただし、まだ2つの問題があります。

1)とこの関数event objectDOM element呼び出しの両方を取得する必要があります。

2)このイベントは委任スタイルで処理されます。イベントを発生させる子DOM要素が存在する可能性があります。つまり、event.target必ずしも(私の場合は通常ではなく)リスナーを持つ要素であるとは限りません。

4

2 に答える 2

1

わかりました、閉鎖は正しい方法でした。上記のシナリオの答えは次のとおりです。

(function(element, event){
    element.attachEvent(
        'on' + event, 
        function(e){
            callback(e, element);
        }
    );
})(element, event);

それはそれを行います!callback は、リスナーを起動しeevent objectおよびelementとして受け取ります (イベント ターゲットである必要はありません)。DOM object

次に、コールバックで:

function callback(event, obj){
    obj = obj || this;
    console.log(event, obj);
}

thisリンクで提案されているように、匿名関数と .call を試してみましたが、うまくいきcallback()ませevent objectんでした。

于 2012-11-20T16:57:03.880 に答える
0

私はこれを閉じることに投票しましたが、議論が欠けているようですので、このようなものです

element.attachEvent("on"+event, function(){ callback.apply( element, arguments ); });
于 2012-11-20T16:38:45.407 に答える