2011-03-28 49 views
24

Tengo un formulario con algunos cuadros de entrada y selección, cada uno tiene class="myClass". También tengo el siguiente script:jQuery change event llamado dos veces

$(document).ready(function() { 
    $(".myClass").change(function() { 
     alert('bla'); 
    }) 
}); 

No entiendo por qué después de cada cambio en el cuadro de selección o en la caja de entrada, esta función se llama dos veces. ¿Qué pasa aquí?

¡Apreciar tu ayuda!

+2

muestra su código de forma de wntire – fl00r

+3

Como fl00r indicado, sería útil ver más de su código. Las llamadas de doble función a menudo son un síntoma de la vinculación involuntaria de su manejador dos veces. – Ender

+1

gracias, Uberstein me acaba de mostrar mi error – Israel

Respuesta

35

Todo lo que puedo pensar es que usted usó la misma clase en el formulario. de ser así, elimine el estilo myClass de su etiqueta de formulario.

Corregido: http://jsfiddle.net/rY6Gq/1/

uno defectuoso con alarma doble: http://jsfiddle.net/rY6Gq/

+2

Apuesto a que su derecha +1 buena llamada – mcgrailm

+2

oh no lo eres a la derecha y soy tan tonto :(¡gracias! – Israel

+1

Solo me apuntó en la dirección correcta, thx – fgysin

-1

Trate depurar el código en Firebug en lugar de alertar. Puede perder el foco y devolverlo está causando la aparición de dos cambios cuando no hay dos ocurriendo

+0

y sé que esto le ha sucedido a un amigo, pero no estoy seguro de qué navegador estaba usando en el momento –

3

Ocurre cuando la misma clase o el atributo que está vinculando también tiene el mismo nombre padre o hijo. Obviamente, cuando cambia a un niño, el padre también se cambia (su hijo cambia). Si tienen la misma clase o atributo, debe disparar dos veces. Por ejemplo, a continuación, si se une a "myClass", se llamará dos veces.

<div class="myclass"> 
<select class="myClass"> </select> 
</div> 
+0

muchas gracias. Era una solución. En mi caso, selectpicker generó un div con la misma clase que en mi etiqueta de selección inicial . – syler

7

Es un insecto, deberá añadir

$("#some_id").unbind('change'); 

antes de cualquier cambio de llamadas

+0

gracias, ayudó. – tereru

3

e.stopImmediatePropagation(); es lo que funcionó para mí

$(document).ready(function() { 
    $(".myClass").change(function(e) { 
     e.stopImmediatePropagation(); 
     alert('bla'); 
    }) 
}); 
Cuestiones relacionadas