Cómo separar el evento jquery (function) del elemento

Deseo eliminar este evento de clic si mi request de ajax es exitosa:

$('.el a').live('click', function(event){ event.preventDefault(); $.ajax({ url: $(this).attr('href'), type: 'GET', success: function(response){ // how to detach this function here? (the live click event) } }); }); 

Su problema es que live no está vinculado a ningún set específico de elementos, sino que está vinculado a los elementos que coinciden con un selector en particular en el momento en que ocurre el evento click. Eso significa que no puede usar unbind o off para evitar que el clic active el controller.

Sin embargo, puede modificar ligeramente su selector para excluir elementos con una determinada class y luego agregar esa class para indicarle a live que ignore su elemento:

 $('.el a:not(.been-clicked)').live('click', function(event){ event.preventDefault(); var $this = $(this); $.ajax({ url: $this.attr('href'), type: 'GET', success: function(response){ $this.addClass('been-clicked'); } }); }); 

Demostración de la técnica: http://jsfiddle.net/ambiguous/Deh5j/


Greg Pettit tiene razón en los comentarios que en live ya no deberían usarse si está utilizando jQuery 1.7 y algo mal visto incluso en 1.6. Por lo general, es mejor utilizar delegate antes de 1.7 y activado si está usando 1.7:

 $(document).on('click', '.el a:not(.been-clicked)', function() { //... }); 

Aún no puede usar unbind o off para detener esta versión de on (excepto en circunstancias muy limitadas, como si solo tiene un elemento que coincida con .el a y solo tiene asociado un manejador de clics (o si usa una function nombrada) )). Todavía necesita algo como el truco anterior de "agregar una class como bandera" si está utilizando el enlace de estilo "en vivo", si está vinculando a un set específico de elementos que existen cuando vincula su manejador de clics, entonces no debería Para usar live , debe usar uno de bind , click o on para vincular un manejador a esos elementos específicos; y luego podría usar unbind o off para separar los controlleres. O mejor, simplemente usaría one y dejaría que jQuery se preocupara por separar el controller.

Creo que quieres:

 .unbind("click"); 

o en jQuery 1.7+

 .off("click"); 

Nota: esto eliminará el evento click del elemento cliqueado; si desea evitar que los elementos recién creados tengan un evento click (es decir, deshabilitar el método live() ), en su lugar querrá hacer:

 $('.el a').die("click"); 

Esto se puede hacer mediante el uso de .unbind() pero no puede usarlo desde dentro de la function de éxito de la class ajax ya que se referirá a un object diferente que proviene de una callback de function y luego al elemento en el que hizo clic. en su lugar, cree una variable que almacene el elemento al que se hizo clic; Utilicé elem en este caso y lo uso para desvincular su evento de clic en éxito $(elem).unbind('click');

 $('.el a').live('click', function(event){ event.preventDefault(); var elem = this; $.ajax({ url: $(this).attr('href'), type: 'GET', success: function(response){ $(elem).unbind('click'); } }); }); 

Editar : @mu es demasiado corto como se ha señalado aparentemente en las versiones anteriores antes de 1.7 es más difícil, entonces debería ser para matar un evento establecido por .live () y su ejemplo