SearchBox というクラスを作成して、検索操作 (トリガーの遅延、Enter キーを押したときの検索、アクティブな検索の防止、検索が完了してテキストが変更されたときの結果の同期など) を処理しました。
すべてのクラス メソッドはプロトタイプ メソッドであり、 経由でアクセスすることを意図していますthis
。p
次のコードでは、 がクラスのプロトタイプであると想定しています。
p.registerListeners = function () {
$(this.element).on('keypress', this.searchKeyPressed);
};
p.unregisterListeners = function () {
$(this.element).off('keypress', this.searchKeyPressed);
};
keypress イベントがsearchKeyPressed
ハンドラーを呼び出すとき、のコンテキストではそうしないため、これは機能しませんthis
。私が思い付くことができる唯一の解決策は、最新のブラウザーのみがサポートするものでthis
あり、実際に新しい関数を作成するコールバックを にバインドすることです。新しい関数を作成するため、後で削除するためにキャッシュする必要があります。これは、に渡したものと同じ参照を渡す必要があるoff
ためon
です。
これよりも良い方法はありますか、それともこれで問題ありませんか?
var boundKeyPressed;
p.registerListeners = function () {
boundKeyPressed = this.searchKeyPressed.bind(this);
$(this.element).on('keypress', boundKeyPressed);
};
p.unregisterListeners = function () {
$(this.element).off('keypress', boundKeyPressed);
};
jQuery.on
このイベントバインディングを自動的に行う方法を提供するのではないかと思っていましたが、this
呼び出し方によって異なるものにバインドされているようです。たとえば、 を使用する場合on('eventname',instance.func)
、this
は「currentTarget」(バブリング用語では必ずしも「ターゲット」とは限りません) ですが、 を使用する場合は、セレクターに一致する要素を参照しますon('eventname','selector',instance.func)
。this
どちらの場合でも、 はfunc
と関係がないかのように実行されますinstance
。