web-dev-qa-db-ja.com

特定のイベントハンドラーのバインドを解除する方法

コード:

$('#Inputfield').keyup(function(e)
        {
            if(e.which == 13)
            {
                functionXyz();
            }
            else
            {
                functionZyx();
            }
    });  


$(document).keyup(function(exit) {
              if (exit.keyCode == 27) { functionZzy(); }
});

質問: keyCode == 27のキーアップイベントハンドラーを削除し、他の$(document).keyupイベントハンドラーをそのまま保持する方法

45
MeProtozoan

次のように .unbind() を呼び出すときにその特定のハンドラーを参照できるように、名前付き関数を使用する必要があります。

function keyUpFunc(e) {
  if (e.keyCode == 27) { functionZzy(); }
}
$(document).keyup(keyUpFunc);

その後、バインドを解除するとき:

$(document).unbind("keyup", keyUpFunc);
80
Nick Craver

イベントハンドラーをさまざまな要素にアタッチしているため、特定のオブジェクトからハンドラーを安全に削除できます(既に説明したとおり)。

完全を期すために、同じイベントの複数のハンドラーをsameオブジェクトに添付する場合は、 名前空間イベント

$('#Inputfield').bind('keyup.keep', function(e){/*...*/});
$('#Inputfield').bind('keyup.notkeep', function(e){/*...*/});

$('#Inputfield').unbind('keyup.notkeep');
// or event  $('#Inputfield').unbind('.notkeep');

jQuery 1.7なので、メソッド .on および .off は、イベントハンドラーを追加および削除する推奨方法です。この目的のために、それらは.bindおよび.unbindまた、名前空間付きイベントでも動作します。

63
Felix Kling

jQueryを使用すると、最初の呼び出し後にバインドされないイベントをバインドできます。このキーアップ関数を一度だけ実行したい場合は、ここにリストされている.one()メソッドを見てください。 http://api.jquery.com/one/

$(document).one('keyup', function(e) {
              if (e.keyCode == 27) { functionZzy(); }
});
8
Dan D.

要素にハンドラーが1つしかない場合、Nick Craverが示唆するように、名前付き関数を使用せずにunbindを使用して安全にアンバインドできます。この場合、呼び出し

$('#Inputfield').unbind('keyup');

documentのハンドラーには影響しません。

7
lonesomeday