4

私は次のことについて話している:

.unbind().click(function () {
    // Do something
}

私には少し危険に見えますが、それは理にかなっています。開発者は、最初に要素にバインドされたイベントをすべて削除してから、クリックイベントをバインドしたいと考えています。

この問題のより良い解決策はありますか?または私の考え方を修正します。

4

5 に答える 5

9

どのクリックイベントがバインド解除されるかを制御しないため、これは実際には良い習慣ではありません。これを改善するには、2つの異なるアプローチがあります。


イベント名前空間を使用する(より高速)

名前空間を使用して、再度バインドするクリックイベントのみのバインド解除を制御できます。

$(selector).off('click.namespace').on('click.namespace', function(e) { //...

クラスを使用する(最速)

リンクに追加されたクラスを使用して、登録済みとしてマークします(これは、以前にバインドされたイベントのバインドを解除しませんが、複数のイベントのバインドを防ぐのに役立ちます。これは、ほとんどの場合、off(バインド)の前にon(バインド解除)を使用する場合の問題です。

$(selector).not('.registered').addClass('registered').on('click', function(e) { //...

これを少しセクシーなプラグインに変えて、次のように書くこともできます。

$.fn.register = function(register_class) {
  register_class || (register_class = 'registered'); // lets you control the class
  return this.not('.' + register_class).addClass(register_class);
};

registerこのように、すべてのセレクターを呼び出すことができます。

$(selector).register().on('click', function(e) { //...

または、特定のクラスで、«登録済み»が取得された場合:

$(selector).register('special_handler_registered').on('click', function(e) { //...


パフォーマンス?

さまざまなハンドラーのパフォーマンスについて疑問がある場合:

このパフォーマンステストをここでチェックしてください

于 2012-08-21T07:49:34.153 に答える
2

ボタン、リンクなどの動作を「更新」する必要があるときはいつでも、このアプローチに従いましたが、問題はないと思います。ただし、コードを使用すると、要素にアタッチされているすべてのハンドラーが削除されることに注意してください。したがって、代わりに:

$(selector).unbind('click').click(function(){
    // do something
})
于 2012-08-21T07:33:43.820 に答える
1

少なくとも、バインドを解除するイベントハンドラーを指定することをお勧めします。したがって、クリックイベントヘンドラーがあり、それだけをアンバインドしたい場合は、を使用できますunbind('click')

于 2012-08-21T07:34:53.653 に答える
1

ハンドラーに加えて他のハンドラーが存在する可能性があるため、名前空間を使用することは理にかなっています。

$(selector).off('click.myns').on('click.myns', function() {....})

or 

$(selector).unbind('click.myns').bind('click.myns',function() {...})

このようにすると、jqueryプラグインによって追加されたものなど、他のハンドラーではなく、独自のハンドラーにのみ触れることができます。

于 2012-08-21T07:37:35.133 に答える
1

私は通常、名前付きイベント関数を明示的にバインド解除できるようにするために、可能な限り使用しようとします。

$('a').unbind('click.myfunc').bind('click.myfunc', function(evt) { ... });

このようにして、このバインディングを、複数回実行できるinit関数に追加できます(何らかの理由でデリゲートを使用できない状況で便利です)。

一般に、必要がなければ、すべてのイベント、または特定のイベントのすべてのハンドラーのバインドを解除しようとはしません。

また、最新の状態を維持し、すべてのバインド/バインド解除呼び出しをオン/オフに置き換えようとしています;-)

于 2012-08-21T07:37:43.257 に答える