Как отменить привязку к определенному обработчику событий - PullRequest
44 голосов
/ 20 октября 2010

Код:

$('#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Обработчики событий не повреждены?

Ответы [ 4 ]

78 голосов
/ 20 октября 2010

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

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

Затем позже, когда отсоединяем:

$(document).unbind("keyup", keyUpFunc);
63 голосов
/ 20 октября 2010

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

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

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

8 голосов
/ 20 октября 2010

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

$(document).one('keyup', function(e) {
              if (e.keyCode == 27) { functionZzy(); }
});
7 голосов
/ 20 октября 2010

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

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

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

...