trigger change javascript jquery jquery-click-event

javascript - trigger - ¿El evento jQuery.change() se activa con.click() en las versiones más recientes?



onchange jquery input text (4)

Creo que puede hacer que funcione tanto para las implementaciones de jQuery 1.4.4 como para las de 1.6 colocando change () en el controlador de clic y luego activando el clic.

$(''.myelement'').click(function(){ $(''.myelement'').change(); alert($(this).val()); }); $(''.myelement'').trigger(''click'');

Echa un vistazo por ejemplo simple.

Actualmente estoy actualizando mi aplicación para usar jQuery 1.6.1 (anteriormente usando 1.4.4) y descubrí que ahora el evento .click() activa automáticamente un evento .change() .

He creado un ejemplo simple aquí: http://jsfiddle.net/wDKPN/

Observe si incluye 1.4.4 la función .change() no se activará cuando se .click() evento .click() . Pero cuando se cambia a 1.6, el evento .click() se activa cuando se .click() .

Dos preguntas:

  1. ¿Es esto un error? Parece que activar .click() no debería disparar otros eventos (por ejemplo, parece incorrecto disparar automáticamente .blur() y .focus() , para ayudar a "imitar" el clic de un usuario).

  2. ¿Cuál es la forma correcta para enlazar un evento change() y luego activar un evento click() y change() para ese elemento? ¿Simplemente llamo a .click() y .change() en el hecho de que .change() también se activará?

    $(''#myelement'').change(function() { // do some stuff }); $(''#myelement'').click(); // both click and change will fire, yay!

En mi código anterior, estoy usando este patrón para inicializar algunas casillas de verificación (y sus estados y valores comprobados) después de una llamada ajax:

$(''#myelement'').change(function() { // do some stuff including ajax work }).click().change();

Pero en 1.6.1 mi lógica se dispara dos veces (una para .click() y una para .change() ). ¿Puedo confiar simplemente en eliminar el .change() y esperar que jQuery continúe comportándose de esta manera en futuras versiones?


La mejor manera de hacer esto es:

$(''#myelement'').bind(''initCheckboxes change'', function() { // do some stuff including ajax work }).trigger(''initCheckboxes'');

Para realizar tus tareas de inicialización, solo debes vincularlo a un evento personalizado, que se activa la primera vez que se carga la página. Esto, nadie te quitará en ninguna versión.

Mientras que el evento de change , creo, seguirá existiendo en todas las versiones, porque ha estado durante tanto tiempo, y simplemente funciona muy bien de esa manera.

Al final, esta es una historia de final feliz, porque los eventos personalizados initCheckboxes se initCheckboxes solo una vez en la carga de la página y el evento de change siempre escuchará y se activará en el estado de cambio.


Olvídate del evento clic para las casillas de verificación. El evento de cambio maneja todo.

$(''#myelement'').change(function() { // do some stuff }); $(''#myelement'').trigger(''change'');

Compruébelo usted mismo: http://jsfiddle.net/zupa/UcwdT/ (esta demostración está configurada para jQuery 1.8 pero también funciona en 1.6).


Yo diría que este fue un error en jQuery 1.4.4. La eliminación de los controladores de eventos jQuery y el uso de addEventListener estándar produce el mismo resultado que jquery 1.6.1.

http://jsfiddle.net/jruddell/wDKPN/26/

window.count = 0; document.getElementById(''mycheckbox'').addEventListener(''change'', function() { window.count++; jQuery(''#output'').append(''I fired: '' + window.count + '' times<br />''); }); document.getElementById(''mycheckbox'').click();

También usaría triggerHandler para invocar específicamente un controlador de eventos jQuery. Si desea que el modelo de evento determine a qué manejadores llamar, use click , change , etc.