2010-10-19 11 views
39

Codice:Come non associare un gestore di eventi specifica

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


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

Domanda: Come rimuovere il gestore di eventi keyup di keyCode == 27 e tenere l'altra $ (document) .keyup gestori di eventi intatto ?

+7

Perché denominare l'oggetto evento "uscita"? –

+0

Il 'keyCode == 27' ** è ** quello che è collegato a' $ (document) .keyup' ... per favore chiarire. –

risposta

74

Devi usare una funzione chiamata in modo da poter fare riferimento che gestore specifico quando si chiama .unbind(), in questo modo:

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

Poi più tardi, quando non vincolante:

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

jQuery consente di associare gli eventi ciò non sarà limitato dopo la loro prima invocazione. Se stai cercando di eseguire questa funzione solo keyup una volta, guarda il metodo .one() elencati qui: http://api.jquery.com/one/

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

Se avete solo un gestore su un elemento, è possibile separare in modo sicuro utilizzando unbind senza usare funzioni nominate come suggerisce Nick Craver. In questo caso, chiamando

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

non influenzerà il gestore on document.

61

Si stanno allegando i gestori di eventi a elementi diversi, in modo da poter rimuovere in modo sicuro il gestore dall'oggetto specifico (già menzionato so).

Per ragioni di completezza, se si desidera collegare più gestori per lo stesso evento allo stesso oggetto , è possibile utilizzare namespaced events:

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

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

Dal jQuery 1.7, il metodi .on e .off sono il modo preferito per aggiungere e rimuovere gestori di eventi. A tale scopo si comportano esattamente come .bind e .unbind e funzionano anche con eventi con nomi.

+9

Questa è la migliore risposta qui, il concetto di namespacing è davvero utile e lo uso sempre. Fornisce supporto se tu (o, soprattutto, qualcun altro) aggiunge il binding di eventi allo stesso elemento in una data successiva senza rendersi conto che ha già eventi ad esso associati. Ovviamente se vanno e usano $ ('# myelement'). Unbind ('focus'), scrivi martello senza namespace, i tuoi eventi saranno comunque non associati ... Quindi dì alle persone con cui lavori per iniziare ad usarlo! – calumbrodie

+0

questo è stato abbastanza utile - nuova cosa per me - namespace - grazie! – foxybagga

+2

Mentre il namespaces può essere utile, la possibilità di scegliere come target un'istanza specifica di una funzione che è stata associata può essere più utile. Ho diverse istanze della stessa funzione legate al mio documento e voglio distruggerne solo una. Namespacing non mi aiuta in questo. – Frug

Problemi correlati