2

ハンドラーをイベントにバインドする必要があり、最終的に別のハンドラーをバインドする必要がある場合は、前のハンドラーのバインドを解除する必要があります。

前のハンドラーへの参照があればこれを実行できることはわかっています。この場合はunbindそれだけですが、私のシナリオでは困難です。さらに、私はすべてのハンドラーのバインドを解除できることを知っていますが、これは避けようとしています。

私が欲しいのはこのようなものです:

$("#myInput").bind("click", myHandler, "key");

// here, as I'm passing the same key, this handler will overwrite the previous
$("#myInput").bind("click", myHandler2, "key");

しかし、これは存在しないようです。

なにか提案を?

4

2 に答える 2

2

いいえ、イベントハンドラーは上書きされません。手動で削除する必要があります。

ただし、イベント名に名前空間を付けることができるため、古いものを明示的に知らなくても削除できます(すべてのクリックハンドラーを切り離すだけではありません)。

$("#myInput").on("click.key", myHandler);

$("#myInput").off(".key").on("click.key", myHandler2);

それ以外の場合は、ハンドラーを手動で上書きする必要があります。

var handler = null;
$("#myInput").on("click", function() {
    if (typeof handler=='function') handler.apply(this, arguments);
});

handler = myHandler;

handler = myHandler2;
于 2012-12-11T21:41:29.840 に答える
0

.data()メソッドを使用して、要素にバインドされたすべてのイベントハンドラーにアクセスでき、配列オブジェクトを返します。したがって、ラストクリックハンドラーを見つけることができます。コードは次のようになります。

var lastHandler = null;
jQuery.each($("#myInput").data("events"), function(i, event){
   if(i == 'click'){
      lastHandler = event[event.length-1].handler;
   }
});
$("#myInput").unbind("click", lastHandler);
于 2012-12-12T13:51:36.683 に答える