Estoy buscando información sobre cómo implementar el manejo de eventos personalizado en jquery de la mejor manera. Sé cómo conectar eventos de los elementos dom como 'hacer clic', etc., pero estoy construyendo una pequeña biblioteca / complemento javascript para manejar algunas funciones de vista previa.
Tengo un script en ejecución para actualizar parte del texto en un elemento dom de un conjunto de reglas y datos / entrada del usuario que obtuve, pero ahora necesito ese mismo texto que se muestra en otros elementos que este script no puede conocer. Lo que necesito es un buen patrón para observar de alguna manera este script que produce el texto necesario.
Entonces, ¿cómo hago esto? ¿Pasé por alto alguna funcionalidad incorporada en jquery para generar / manejar eventos de usuario o necesito algún complemento de jquery para hacerlo? ¿Cuál crees que es la mejor forma / complemento para manejar esto?
Respuestas:
Mira esto:
(reimpreso de la página caducada del blog http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ basado en la versión archivada en http://web.archive.org/web /20130120010146/http://jamiethompson.co.uk/web/2008/06/17/publish-subscribe-with-jquery/ )
Publicar / Suscribirse con jQuery
17 de junio de 2008
Con miras a escribir una interfaz de usuario jQuery integrada con la funcionalidad fuera de línea de Google Gears, he estado jugando con algún código para sondear el estado de la conexión de red usando jQuery.
El objeto de detección de red
La premisa básica es muy simple. Creamos una instancia de un objeto de detección de red que sondeará una URL a intervalos regulares. Si estas solicitudes HTTP fallan, podemos suponer que se ha perdido la conectividad de la red o que el servidor simplemente no está disponible en este momento.
Puedes ver la demostración aquí. Configure su navegador para que funcione sin conexión y vea qué sucede ... No, no es muy emocionante.
Disparador y enlace
Sin embargo, lo que es emocionante (o al menos lo que me emociona) es el método por el cual el estado se transmite a través de la aplicación. Me topé con un método en gran parte no discutido para implementar un sistema pub / sub utilizando los métodos de activación y vinculación de jQuery.
El código de demostración es más obtuso de lo necesario. El objeto de detección de red publica eventos de 'estado' en el documento que los escucha activamente y, a su vez, publica eventos de 'notificación' a todos los suscriptores (más sobre eso más adelante). El razonamiento detrás de esto es que en una aplicación del mundo real probablemente habría algo más de control lógico cuándo y cómo se publican los eventos de 'notificación'.
Debido al enfoque centrado en DOM de jQuery, los eventos se publican en elementos DOM (activados). Este puede ser el objeto de ventana u documento para eventos generales o puede generar un objeto jQuery usando un selector. El enfoque que he tomado con la demostración es crear un enfoque casi espaciado de nombres para definir suscriptores.
Los elementos DOM que serán suscriptores se clasifican simplemente con "suscriptor" y "networkDetection". Entonces podemos publicar eventos solo en estos elementos (de los cuales solo hay uno en la demostración) activando un evento de notificación en
$(“.subscriber.networkDetection”)
El
#notifier
div, que forma parte del.subscriber.networkDetection
grupo de suscriptores, tiene una función anónima vinculada a él, actuando efectivamente como un oyente.Ahí vas. Todo es bastante detallado y mi ejemplo no es nada emocionante. Tampoco muestra nada interesante que pueda hacer con estos métodos, pero si alguien está interesado en profundizar en la fuente, siéntase libre. Todo el código está en línea en la cabecera de la página de demostración.
fuente
El enlace proporcionado en la respuesta aceptada muestra una buena manera de implementar el sistema pub / sub usando jQuery, pero encontré el código algo difícil de leer, así que aquí está mi versión simplificada del código:
http://jsfiddle.net/tFw89/5/
fuente
n
cantidad de argumentos.var eventData = [].slice.call(arguments).splice(1)
Creo que sí ... es posible 'vincular' eventos personalizados, como (de: http://docs.jquery.com/Events/bind#typedatafn ):
fuente
myCustomEvent
se levanta, el enlace en la parte superior agrega un oyente.Tenía una pregunta similar, pero en realidad estaba buscando una respuesta diferente; Estoy buscando crear un evento personalizado. Por ejemplo, en lugar de decir siempre esto:
Quiero abreviarlo a esto:
desencadenar y vincular no cuentan toda la historia: este es un complemento de JQuery. http://docs.jquery.com/Plugins/Authoring
La función "enterKey" se adjunta como una propiedad a jQuery.fn - este es el código requerido:
http://jsfiddle.net/b9chris/CkvuJ/4/
Una característica de lo anterior es que puede manejar la entrada del teclado con gracia en escuchas de enlaces como:
Ediciones: actualizado para pasar correctamente el
this
contexto correcto al controlador y para devolver cualquier valor de retorno del controlador a jQuery (por ejemplo, en caso de que estuviera buscando cancelar el evento y el burbujeo). Actualizado para pasar un objeto de evento jQuery adecuado a los controladores, incluido el código clave y la capacidad de cancelar el evento.Viejo jsfiddle: http://jsfiddle.net/b9chris/VwEb9/24/
fuente
scroll
, que no se propaga. Creo que en lugar de tener a los oyentes codificados en el cuerpo, necesito los elementos que tienen elon
evento vinculado a ellos para disparar el evento ellos mismos.Es una publicación antigua, pero intentaré actualizarla con nueva información.
Para usar eventos personalizados, debe vincularlo a algún elemento DOM y activarlo. Entonces necesitas usar
y
El código se ve así:
Una buena explicación se puede encontrar aquí y aquí . ¿Por qué exactamente esto puede ser útil? Encontré cómo usarlo en esta excelente explicación del ingeniero de Twitter .
PD: en javascript simple puedes hacer esto con el nuevo CustomEvent , pero ten cuidado con los problemas de IE y Safari.
fuente
Así es como autorizo eventos personalizados:
De acuerdo, simplemente podrías hacer
Pero la forma en que escribí le permite detectar si el usuario ha evitado el incumplimiento o no al hacer
Esto le permite escuchar la solicitud de su usuario final para detener el procesamiento de un evento en particular, como si hace clic en un elemento de botón en un formulario pero no desea que el formulario se publique si hay un error.
Entonces suelo escuchar eventos como ese
Una vez más, podrías simplemente hacer
Pero siempre he encontrado esto algo inseguro, especialmente si estás trabajando en un equipo.
No hay nada malo con lo siguiente:
Sin embargo, suponga que necesito desvincular este evento por cualquier razón (imagine un botón deshabilitado). Entonces tendría que hacer
Esto eliminará todos los
eventname
eventos de$(element)
. No puede saber si alguien en el futuro también vinculará un evento a ese elemento, y también desunirá involuntariamente ese eventoLa forma segura de evitar esto es crear espacios de nombres en sus eventos haciendo
Por último, es posible que haya notado que la primera línea era
Yo personalmente siempre desatar un evento antes de que la unión sólo para asegurarse de que el mismo controlador de eventos nunca se llama varias veces (imaginar que este era el botón de enviar en un formulario de pago y el evento había sido atado 5 veces)
fuente