2010-10-19 12 views
39

Código:Cómo desenlazar un controlador de eventos específicos

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


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

Pregunta: cómo quitar el controlador de eventos de keyup == keyCode 27 y mantener los otros $ (document) .keyup controladores de eventos intacta ?

+7

¿Por qué nombras el objeto de evento "exit"? –

+0

El 'keyCode == 27' ** es ** el que está adjunto a' $ (document) .keyup' ... aclare. –

Respuesta

74

Tienes que utilizar una función llamada para que pueda hacer referencia a ese controlador específico al llamar .unbind(), así:

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

Luego, más tarde, cuando compromiso.Por:

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

jQuery le permite enlazar eventos eso será desatado después de su primera invocación. Si usted está buscando sólo para ejecutar esta función keyup vez, mirar el método .one() que aparece aquí: http://api.jquery.com/one/

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

Si sólo tiene un manejador de un elemento, se puede desvincular de manera segura usando unbind sin utilizar funciones nombradas como sugiere Nick Craver. En este caso, llamar

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

no afectará al controlador on document.

61

Estás adjuntando los controladores de eventos a diferentes elementos, por lo que puedes quitar el manejador del objeto específico (ya lo mencioné lo sé).

En aras de la exhaustividad, si desea asociar varios controladores para el mismo evento a la misma objeto, puede utilizar namespaced events:

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

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

Desde jQuery 1.7, la los métodos .on y .off son la forma preferida de agregar y eliminar manejadores de eventos. Para este propósito se comportan exactamente como .bind y .unbind y también funcionan con eventos de espacio de nombres.

+9

Esta es la mejor respuesta aquí, el concepto de espacios de nombres es realmente útil y lo uso todo el tiempo. Brinda asistencia si usted (o algo más importante, alguien más) agrega un enlace de evento al mismo elemento en una fecha posterior sin darse cuenta de que ya tiene eventos vinculados a él. Por supuesto, si van y usan un $ ('# myelement'). Unbind ('focus'), escriba hammer sin espacio de nombres, sus eventos se liberarán de todos modos ... ¡Por lo tanto, dígale a las personas con las que trabaja que comiencen a usarlo! – calumbrodie

+0

esto fue bastante útil - algo nuevo para mí - espacios de nombres - ¡gracias! – foxybagga

+2

Si bien el espaciado de nombres puede ser útil, la capacidad de apuntar a una instancia específica de una función enlazada puede ser más útil. Tengo varias instancias de la misma función ligadas a mi documento y quiero destruir solo una de ellas. El espaciado de nombres no me ayuda con eso. – Frug

Cuestiones relacionadas