0

JQuery はthis、イベント ハンドラーとして追加すると、インスタンス メソッドのキーワードを上書きするようです。なぜこれが起こるのですか?以下のコード:

function Foo() {};
Foo.prototype.bark = function() {
    console.log(this);
};

var foo = new Foo();

$("#b").click(foo.bark);

クリック時の出力: <button id="b" type="button">

thisただし、JQuery は以下のコードのキーワードをオーバーライドしていないようです。

$("#b").click(function() { foo.bark(); });

クリック時の出力:

`Foo { bark=function()}`
4

4 に答える 4

5

これは予期される動作です。イベント リスナーとして割り当てられたすべての関数は、 thisイベントが発生した要素インスタンスを指します。

次のようなハンドラーとして匿名ラッパー関数を使用することで、これを克服できます。

$("#b").click(function() {foo.bark() }); 
于 2013-06-13T15:51:23.317 に答える
2

これはclick、要素への参照をそのハンドラーに渡すためです(あなたの場合は樹皮です)

これを行う場合:

$("#b").click(function(){
  foo.bark();
});

thisでクリックした要素を参照するために使用することはできませんbark()

于 2013-06-13T15:51:29.577 に答える
1

ドキュメントから:

handler パラメータはコールバック関数を取ります... ハンドラ内では、キーワードthisはハンドラがバインドされている DOM 要素を参照します。

于 2013-06-13T15:52:36.960 に答える
-1

あなたの問題の解決策は$.proxy(). 詳細については、こちらをご覧ください。

試す$('#b').on('click', $.proxy( foo.bark, this ) )

編集:実際にはプロキシ関数の正しい呼び出しは$.proxy( foo.bark, foo );

于 2013-06-13T15:53:11.680 に答える