Как развязать специальный обработчик событий

Код:

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


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

Вопрос: Как удалить обработчик события keyup keyCode == 27 и сохранить остальные обработчики событий $(document).keyup?

Ответ 1

Вы должны использовать именованную функцию, чтобы ссылаться на этот конкретный обработчик при вызове .unbind(), например:

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

Затем позже при развязывании:

$(document).unbind("keyup", keyUpFunc);

Ответ 2

Вы прикрепляете обработчики событий к различным элементам, поэтому вы можете безопасно удалить обработчик из определенного объекта (уже упомянутый я знаю).

Для полноты, если вы хотите связать несколько обработчиков для одного и того же события с тем же объектом, вы можете использовать события с именами:

$('#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, а также работают с событиями с именами.

Ответ 3

jQuery позволяет связывать события, которые будут отключены после их первого вызова. Если вы хотите запустить эту функцию только один раз, посмотрите на метод .one(), указанный здесь: http://api.jquery.com/one/

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

Ответ 4

Если у вас есть только один обработчик элемента, вы можете безопасно отменить его, используя unbind, не используя именованные функции, как предлагает Nick Craver. В этом случае вызов

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

не влияет на обработчик на document.