2010-10-19 4 views
39

Код:Как отвязать конкретный обработчик события

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


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

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

+7

Почему вы называете объект события «exit»? –

+0

'keyCode == 27' ** - это тот, который прикреплен к' $ (document) .keyup' ... пожалуйста, уточните. –

ответ

74

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

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

Тогда позже, когда развязывание:

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

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

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

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

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

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

61

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

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

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

+9

Это лучший ответ здесь, концепция пространства имен действительно полезна, и я использую ее все время. Он обеспечивает поддержку, если вы (или, что более важно, кто-то еще) добавляет привязку события к тому же элементу позже, не понимая, что к нему уже привязаны события. Конечно, если они пойдут и используют $ ('# myelement'). Unbind («focus»), введите hammer без namespacing, ваши события все равно будут unbound ... Поэтому расскажите людям, с которыми вы работаете, чтобы начать использовать его! – calumbrodie

+0

Это было очень полезно - новая вещь для меня - пространства имен - спасибо! – foxybagga

+2

В то время как пространство имен может быть полезным, может быть более полезным возможность нацеливать конкретный экземпляр функции, которая была связана. У меня есть несколько экземпляров одной и той же функции, связанной с моим документом, и я хочу уничтожить только один из них. Пространство имен не помогает мне в этом. – Frug

Смежные вопросы