2010-09-26 12 views
16

que estaba usando la función live():Usando .one() con .live() jQuery

$('a.remove_item').live('click',function(e) {}); 

necesitaba cambiar esto a one() para evitar varios clics, sin embargo cuando me inyecto uno de estos elementos después de la La página ha cargado el one() El oyente no se activa.

¿Cómo puedo obtener one() para comportarse como live()?

+0

¿desea hacer clic en vivo debería funcionar una sola vez. –

Respuesta

15

Prueba esto:

$('a.remove_item').live('click',function(e) { 
    if($(e.target).data('oneclicked')!='yes') 
    { 
    //Your code 
    } 
    $(e.target).data('oneclicked','yes'); 
}); 

Esto ejecuta el código, sino que también establece un indicador 'oneclicked' como sí, de modo que no se activará de nuevo. Básicamente solo establece una configuración para evitar que se active una vez que se ha hecho clic una vez.

+0

Buena solución. Creo que es mejor que JapanPro porque usar la función de datos es más discreto que agregar una clase. – Kranu

+0

esto parece funcionar bien ¡gracias! – Titan

+0

Sería bueno si hubiera una manera de eliminar el evento sin afectar a otros '$ ('a.remove_item')' – Blowsie

2

probar este

$('a.remove_item').live('click', function(e) { 
    if(!$(this).hasClass('clicked')) 
    { 
     $(this).addClass('clicked'); 
     alert("dd"); // this is clicked once, do something here 
    } 
});​ 
+0

esto funcionaría de forma similar a la función de datos, sin embargo, como Kranu dijo que esto es menos discreto. ¡Gracias de todos modos! – Titan

11

sólo tiene que utilizar jQuery's .die() method en el controlador:

Ejemplo:http://jsfiddle.net/Agzar/

$('a.remove_item').live('click',function(e) { 
    alert('clicked'); 
    $('a.remove_item').die('click'); // This removes the .live() functionality 
});​ 

EDIT:

O si solo desea deshabilitar el evento elemento por elemento, simplemente puede cambiar el nombre de la clase ya que live() está basado en el selector.

Ejemplo:http://jsfiddle.net/Agzar/1/

$('a.remove_item').live('click',function(e) { 
    alert('i was clicked'); 
    $(this).toggleClass('remove_item remove_item_clicked'); 
});​ 

Esto cambió la clase remove_item-remove_item_clicked que podría tener el mismo estilo. Ahora live() no se disparará después del primer clic.

+0

Lo usé hoy. Funciona de maravilla. – jessegavin

15

Aquí hay una versión plug-in para el funcionamiento de un controlador .live() vez, creado exclusivamente por aburrimiento:

$.fn.liveAndLetDie = function(event, callback) { 
    var sel = this.selector; 
    function unbind() { $(sel).die(event, callback).die(event, unbind); } 
    return this.live(event, callback).live(event, unbind); 
}; 

Funciona como .live() haría (a menos que necesite el argumento de datos de eventos, en cuyo caso se necesitaría para agregar la sobrecarga). Simplemente úselo de la misma manera:

$('a.remove_item').liveAndLetDie('click', function(e) { /* do stuff */ }); 

You can test it out here.

+4

+1 para el nombre del método – Blazemonger

+1

Debo señalar que hay una diferencia entre esta respuesta y la marcada como correcta. Con esta respuesta, si la aplica a un grupo de elementos (es decir, '$ ('. Clase')'), solo se ejecutará una vez en cualquiera de los elementos del selector (es decir, si se hizo clic en el primer elemento, segundo no se puede hacer clic) mientras que en la primera respuesta, cada elemento solo se puede hacer clic una vez (es decir, puede hacer clic en el primer elemento una vez, luego en el segundo elemento una vez, etc.). Entonces, en mi caso, encontré que la respuesta marcada como correcta es más beneficiosa en comparación con esta. No sugiriendo ningún cambio, solo señalando una diferencia. – think123

+0

@ think123 punto muy válido, y aplicable en mi caso – Blowsie

0

Sé que esto es una entrada antigua, pero esto funcionó para mí en un caso similar:

$('a.remove_item').live('click', function(e) { 
    e.stopPropagation(); 
    // Your code here 
});​ 
0

lo uso en $ .ajax función, por lo que, en la final, en mi caso falle, me use 500 para retrasarlo y detenerlo para volver a enviarlo muchas veces.

}).fail(function(response, status){ alert("FAILED: "+JSON.stringify(response, null, 4)); },500);

espero que le ayuda!