180 votos

¿Los eventos personalizados en jQuery?

Estoy buscando alguna entrada sobre cómo implementar personalizado eventhandling en jquery de la mejor manera. Sé cómo enlazar los eventos de los elementos del dom, como 'haga clic en' etc, pero estoy construyendo una pequeña biblioteca javascript/plugin para manejar algunos funcionalidad de vista previa.

Tengo un script que se ejecuta la actualización de algunas de texto en un elemento de dom a partir de un conjunto de reglas y datos/entrada de usuario que tengo, pero ahora tengo el mismo texto que se muestra en otros elementos que este script no puede saber. Lo que necesito es un buen patrón para, de alguna manera observar esta secuencia de comandos de producir la necesaria texto.

Entonces, ¿cómo puedo hacer esto? ¿Debo pasar por alto algunas incorporado la funcionalidad de jquery para subir o manejar eventos de usuario o necesito algún plugin de jquery para hacerlo? ¿Cuál crees que es la mejor manera/plugin para manejar esto?

128voto

Manuel Navarro Puntos 750

El enlace proporcionado en la respuesta aceptada muestra una buena manera de implementar el sistema de pub/sub utilizando jQuery, pero he encontrado el código un poco difícil de leer, así que aquí está mi versión simplificada del código:

http://jsfiddle.net/tFw89/5/

$(document).on('testEvent', function(e, eventInfo) { 
  subscribers = $('.subscribers-testEvent');
  subscribers.trigger('testEventHandler', [eventInfo]);
});

$('#myButton').on('click', function() {
  $(document).trigger('testEvent', [1011]);
});

$('#notifier1').on('testEventHandler', function(e, eventInfo) { 
  alert('(notifier1)The value of eventInfo is: ' + eventInfo);
});

$('#notifier2').on('testEventHandler', function(e, eventInfo) { 
  alert('(notifier2)The value of eventInfo is: ' + eventInfo);
});

105voto

Vitor Silva Puntos 4804

Echa un vistazo a esto:

(reimpreso de los vencidos de la página 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 / Suscribir Con jQuery

17 de junio de 2008

Con miras a la elaboración de una interfaz de usuario jQuery integrado con la funcionalidad sin conexión de Google Gears he estado jugando con el código de encuesta para el estado de conexión de red usando jQuery.

La Red De Detección De Objetos

La premisa básica es muy simple. Creamos una instancia de una red de detección de objeto en el que se encuesta una dirección URL a intervalos regulares. En caso de que estas peticiones HTTP fallar podemos asumir que la conectividad de red que se ha perdido, o el servidor es simplemente inalcanzable en el tiempo actual.

$.networkDetection = function(url,interval){
    var url = url;
    var interval = interval;
    online = false;
    this.StartPolling = function(){
        this.StopPolling();
        this.timer = setInterval(poll, interval);
    };
    this.StopPolling = function(){
        clearInterval(this.timer);
    };
    this.setPollInterval= function(i) {
        interval = i;
    };
    this.getOnlineStatus = function(){
        return online;
    };
    function poll() {
        $.ajax({
            type: "POST",
            url: url,
            dataType: "text",
            error: function(){
                online = false;
                $(document).trigger('status.networkDetection',[false]);
            },
            success: function(){
                online = true;
                $(document).trigger('status.networkDetection',[true]);
            }
        });
    };
};

Usted puede ver la demo aquí. Configurar su navegador para trabajar sin conexión y ver qué pasa.... no, no es muy emocionante.

Gatillo y se Unen

¿Cuál es emocionante, aunque (o al menos lo que es emocionante mí) es el método por el cual el estado obtiene retransmite a través de la aplicación. Me he tropezado con una gran parte de la onu-se discutió el método de la implementación de un pub/sub sistema usando jQuery gatillo y los métodos de enlace.

La demo código es el más obtuso de lo que necesitan ser. La red de detección de objetos publica 'status 'eventos para el documento en el que se escucha activamente para ellos y, a su vez publica 'notificar' eventos para todos los suscriptores (más de los que más tarde). El razonamiento detrás de esto es que en una aplicación real lo más probable era que algo más de la lógica de control de cuándo y cómo el 'notificar' eventos publicados.

$(document).bind("status.networkDetection", function(e, status){
    // subscribers can be namespaced with multiple classes
    subscribers = $('.subscriber.networkDetection');
    // publish notify.networkDetection even to subscribers
    subscribers.trigger("notify.networkDetection", [status])
    /*
    other logic based on network connectivity could go here
    use google gears offline storage etc
    maybe trigger some other events
    */
});

Debido a que jQuery DOM enfoque centrado en los eventos se publican a (activa) de elementos DOM. Esta puede ser la ventana o el objeto del documento para eventos generales o puede generar un objeto jQuery mediante un selector. El enfoque que he tomado con la demo es para crear una casi nombres de espacios para la definición de los suscriptores.

Elementos del DOM que serán abonados se clasifican simplemente con el "suscriptor" y "networkDetection". Entonces podemos publicar eventos sólo a estos elementos (de los que sólo hay uno en la demo) mediante la activación de una notificación de eventos en $(".subscriber.networkDetection")

La #notifier div, que es parte de la .subscriber.networkDetection grupo de suscriptores, a continuación, tiene una función anónima vinculada a ella, actuando efectivamente como oyente.

$('#notifier').bind("notify.networkDetection",function(e, online){
    // the following simply demonstrates
    notifier = $(this);
    if(online){
        if (!notifier.hasClass("online")){
            $(this)
                .addClass("online")
                .removeClass("offline")
                .text("ONLINE");
        }
    }else{
        if (!notifier.hasClass("offline")){
            $(this)
                .addClass("offline")
                .removeClass("online")
                .text("OFFLINE");
        }
    };
});

Así, hay que ir. Es todo muy detallado, y mi ejemplo no es del todo emocionante. Asimismo, no un escaparate de todo lo interesante que se podría hacer con estos métodos, pero si alguien está interesado en absoluto a cavar a través de la fuente de sentirse libre. Todo el código está en línea en el head de la página de demostración

21voto

Tuxified Puntos 535

Eso creo.. es posible enlazar '' los eventos personalizados, como (de: http://docs.jquery.com/Events/bind#typedatafn):

 $("p").bind("myCustomEvent", function(e, myName, myValue){
      $(this).text(myName + ", hi there!");
      $("span").stop().css("opacity", 1)
               .text("myName = " + myName)
               .fadeIn(30).fadeOut(1000);
    });
    $("button").click(function () {
      $("p").trigger("myCustomEvent", [ "John" ]);
    });

15voto

Chris Moschini Puntos 7278

Yo tenía una pregunta similar, pero en realidad estaba buscando una respuesta distinta; yo estoy buscando para crear un evento personalizado. Por ejemplo, en lugar de siempre diciendo esto:

$('#myInput').keydown(function(ev) {
    if (ev.which == 13) {
        ev.preventDefault();
        // Do some stuff that handles the enter key
    }
});

Quiero abreviar a este:

$('#myInput').enterKey(function() {
    // Do some stuff that handles the enter key
});

gatillo y se unen no cuentan toda la historia - este es un plugin de JQuery. http://docs.jquery.com/Plugins/Authoring

El "enterKey" la función se une como una propiedad para jQuery.fn - este es el código necesario:

(function($){
    $('body').on('keydown', 'input', function(ev) {
        if (ev.which == 13) {
            var enterEv = $.extend({}, ev, { type: 'enterKey' });
            return $(this).trigger(enterEv);
        }
    });

    $.fn.enterKey = function(selector, data, fn) {
        return this.on('enterKey', selector, data, fn);
    };
})(jQuery);

http://jsfiddle.net/b9chris/CkvuJ/

Una sutileza de los de arriba se puede controlar la entrada de teclado correctamente en el enlace de oyentes como:

$('a.button').on('click enterKey', function(ev) {
    ev.preventDefault();
    ...
});

Edita: Actualizado a pasar adecuadamente el derecho this contexto para el controlador, y a la devolución de cualquier valor de retorno desde el controlador para jQuery (por ejemplo, en el caso de que usted estaba buscando a cancelar el evento y burbujeante). Actualizado a pasar una adecuada jQuery objeto de evento de controladores, incluyendo el código de la llave y la capacidad para cancelar el evento.

Edad jsfiddle: http://jsfiddle.net/b9chris/VwEb9/24/

9voto

Salvador Dali Puntos 11667

Es un viejo post, pero voy a tratar de actualizar con una nueva información.

El uso de eventos personalizados que usted necesita para enlazar a algún elemento de DOM y a la desencadenan. Por lo que necesita utilizar

.on() método toma un tipo de evento y gestión de eventos como función los argumentos. Opcionalmente, también puede recibir eventos relacionados con datos como su segundo argumento, empujando el caso de la manipulación de la función de la tercera argumento. Cualquier dato que se pasa estarán disponibles para el evento función de manejo en la propiedad data del objeto de evento. El evento el manejo de la función recibe siempre el objeto de evento como su primer argumento.

y

.gatillo() método toma un tipo de evento como su argumento. Opcionalmente, también puede tomar un conjunto de valores. Estos valores se pasan a la manejo de eventos función como argumentos después de que el objeto de evento.

El código tiene este aspecto:

$(document).on("getMsg", {
    msg: "Hello to everyone",
    time: new Date()
}, function(e, param) {
    console.log( e.data.msg );
    console.log( e.data.time );
    console.log( param );
});

$( document ).trigger("getMsg", [ "Hello guys"] );

Bonita explicación se puede encontrar aquí y aquí. ¿Por qué esto puede ser útil? He encontrado cómo utilizar la función de esta excelente explicación de twitter ingeniero.

P.S. En la llanura de javascript, se puede hacer esto con los nuevos CustomEvent, pero ten cuidado de IE y Safari problemas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X