2010-01-24 14 views
30

Tengo elementos de entrada y botón HTML. Utilizo los botones para enviar formularios, abrir ventanas secundarias, etc. El problema es que un solo clic se convierte en 2 (y algunas veces más) presentaciones de formularios, o la apertura de dos ventanas adicionales del navegador. He reproducido el problema en múltiples navegadores web. Intenté cambiar las versiones de jQuery y eso no cambió nada. ¿Qué podría estar causando este tipo de cosas?jQuery: clic de un solo botón, haga clic en el evento de disparo dos o más veces

+1

Probablemente lo estés haciendo mal. Publique un código o una versión en http://www.jsbin.com para que podamos ayudarlo. – Kobi

+1

Sí, definitivamente necesita publicar su código; de lo contrario, no tenemos ninguna posibilidad de ayudar. –

+0

Estoy teniendo el mismo problema, ninguna de las soluciones funcionó porque en mi caso se llama a 1 ventana emergente por confirmar ("..") y presionar la tecla "enter" en ese momento causaría "OK" y 1 acción en el elemento seleccionado en el fondo. ¿Alguna ayuda? –

Respuesta

80

Su problema puede estar ocurriendo porque está asignando el mismo controlador que el clic evento varias veces. Le sugiero que verifique que la línea donde asigna el controlador no se llame varias veces inadvertidamente. Otra solución podría ser una llamada a la primera desenlaza como esto:

$("#myButton").unbind("click").click(myHandler); 

Pero sin ver algo de código Sólo estoy adivinando.

+0

casi 6 años después, sigue funcionando de maravilla. ¡Gracias! – Haring10

+0

¡Gran respuesta simple! – Kelvin

+0

¿Por qué usar unbind? Simplemente llama a .off(): 'jQuery.fn.unbind.toSource()' da '" (función (a, b) {return this.off (a, null, b)}) "' – NoBugs

12

Teniendo en cuenta que usted no ha suministrado una gran cantidad de información, lo mejor que puedo recomendar es mirar a la una()

http://api.jquery.com/one/

8

jQuery Sparkle proporciona una solución limpia y elegante para esto, llamando a la función "una vez" puede vincular a un controlador a un evento solo una vez.

Es una mejora importante con respecto a la sugerencia de Darko Z como usando:

$("#myButton").unbind("click").click(myHandler); 

¿Sería desvincular cualquier otro manipuladores "clic" asociadas al evento "clic" cada vez que se llama. ¡Así que asegúrate de que solo esté vinculado una vez, sin embargo, desvinculas todo lo demás accidentalmente! Ooops!

La sugerencia de jarrett desvincula el manejador de "clic" inmediatamente después de que se invoca, por lo que si desea llamar al manejador de nuevo (después de su activación inicial) deberá volver a vincular el manejador.

El uso de jQuery Sparkle una vez permitirá que el controlador se dispare tantas veces como lo necesite, pero solo se vinculará una vez en lugar de varias veces. Se puede utilizar de esta manera:

$('#myButton').once('click', function(){ 
    // my handler 
}); 

O si lo desea apoyar a los datos de su devolución de llamada como jQuery incorporado en "atar", entonces usted puede utilizar:

$('#myButton').once('click', data, function(){ 
    // my handler 
}); 

se pueden encontrar los código fuente para definir la función una vez here.

Es de código abierto bajo la licencia AGPL, por lo que puede tomarse lo que necesita de forma gratuita ¡sin preocupaciones! :-) También se desarrolla activamente en el día a día, por lo que nunca estará corto de apoyo.

Pero lo más importante es un marco de plugin/efecto DRY que le permite desarrollar complementos y extensiones mucho más fácilmente. ¡Así que espero que esto ayude a lograr ese objetivo!

+1

Sé que esto es viejo, pero esta respuesta me lleva a la solución correcta ... en la versión jQuery de hoy he usado .una función vinculante y mi problema está resuelto –

6

para mí fue causado por

$(function() { 
    $('.some-element').click(function() { 
     //event that fires twice 
    }); 

    //some exception-throwing code here 
}); 

jQuery fue llamar a la función anónima listo en dos ocasiones (?!) a causa de la excepción por lo que la función de clic estaría obligado dos veces.

4

Puede utilizar $("div").one("click", function() { ... });

Adjuntar un manejador a un evento para los elementos. El controlador se ejecuta como máximo una vez por elemento.

jquery.com

1

llamar a algo como esto antes que trabajó para mí ya que me había utilizado originalmente $ ('# myButton'). En ('clic' ... para asignar mis oyentes.

$('#myButton').off(); 

Documentation for "off();"

3

Esto va a funcionar bien. que funcione para mí.

$(".class-name").unbind().click(function() { 
    //Do the Stuff 
}); 
1

Tuve un problema con las ventanas de diálogo modal. El evento se disparó una vez por cada vez que abrí un diálogo en la sesión. Ningún problema en la primera ventana, disparado dos veces en la segunda ventana, disparado tres veces en la tercera ventana, etc.

Encontré que se llamaba a la función de inicialización para el diálogo cada vez que abrí un nuevo cuadro de diálogo en el misma sesión Agregué una variable global notInit = -1 y asigné el valor a 1 cuando ejecuté init. Comprobé el valor de notInit antes de ejecutar la función init y solo procedí con init si el valor era -1.

+0

esto suena como algo que hubiera me gusta implementar, pero no estoy seguro de la sintaxis de los pasos. Si no es demasiada escritura, ¿podría proporcionar un fragmento de código en su respuesta? – Chris22

Cuestiones relacionadas