2011-06-18 11 views
5

Enredado con el evento keyup desencadenante mediante jQuery.jQuery desencadena el evento de keyup solo si se adjuntó con jQuery

Aquí está el ejemplo limpia

http://jsfiddle.net/xQcGM/2/

Cuando escribo en cualquiera de input 's, ambos eventos fuego, pero cuando trato de disparar mediante programación ($(element).trigger('event')) sólo el segundo se dispara , pero espero ambos.

¿Dónde echo de menos algo?

UPD I no se puede cambiar el controlador de la forma en que se adjuntó!

+0

"cuando intento disparar programáticamente" - ¿qué quieres decir? – Webars

+0

Buena pregunta. Pero, ¿por qué estás mezclando tus enlaces de eventos, por cierto? ¿O se trata de diferentes archivos de script que usan diferentes formas de vincular eventos? –

+0

@Webars programmatically = '$ (element) .trigger ('event')' – disfated

Respuesta

6

La forma nativa de desencadenar eventos es llamar al dispatchEvent. Lamentablemente, este método no aparece en ningún lugar en jQuery's source. Así que supongo que debes crear los objetos del evento y enviarlos manualmente.

Aquí hay una versión más larga con un example que funciona.

$('button').click(function() { 
     var myEvent = document.createEvent('KeyboardEvent'); 
     myEvent.initKeyboardEvent('keyup', true, true, null, false, 
           false, false, false, 76, 0); 
     $('input').each(function() { 
      this.dispatchEvent(myEvent); 
     }); 
    }); 

O usted podría mirar a jQuery simulate plugin que hace que sea un poco más fácil. Aquí hay una versión más corta con otro trabajo example.

$('button').click(function() { 
    $('input').simulate('keyup'); 
}); 
+0

Gracias, eso está claro ahora. No es necesario, pero podría ser de alguna manera podría extender la funcionalidad de jQuery trigger que haría esos falsos 'KeyboardEvent's dentro? – disfated

+0

No he visto la fuente del activador, pero reemplazarlo con tu propio código es bastante 'fácil'. Sin embargo, entonces tendría que lidiar con los problemas de normalizar un evento DOM a un evento jQuery para asegurarse de que todo el manejo de otros eventos funciona normalmente, estableciendo las propiedades correctas en ese objeto de evento y tratando con los problemas entre navegadores. La solución no es tan simple como crear un contenedor, que distribuye los eventos DOM directamente y luego llama a la implementación de jQuery ya que el mismo evento se activará dos veces en ese caso: una vez para todos los eventos en el elemento y una vez para los eventos jQuery vinculados. – Anurag

Cuestiones relacionadas