2012-04-16 13 views
10

¿Es posible escuchar TODOS los eventos de un evento básico si los eventos son espacios de nombres?jQuery: vincular espacios de nombres eventos

Ejemplo:

$elmt.bind("change", function (event) { 
    console.log(event); 
}); 
$elmt.trigger("change.namespace1"); 
$elmt.trigger("change.namespace2"); 

Esto sólo funciona si se unen a los nombres completos del evento, pero esto es lo que no sé en esta posición :(

+0

¿qué estás tratando de hacer exactamente? – Evan

+0

Un complemento de jquery desencadena eventos de cambio espaciados (change.channel, change.selected y otros). Me gustaría hacer una acción si uno de los eventos de cambio se ha activado. No acostumbro codificar todos los espacios de nombres posibles. –

+0

Acabo de encontrar su pregunta después de publicar [mine] (http://stackoverflow.com/questions/12590231/bind-to-all-namespaces-of-custom-jquery-event). También me gustaría saber si esto es posible. – jschr

Respuesta

1

Se puede, pero no es perfecto.

Por ejemplo:.

function eventHandler(event){ 
    $("#output").html($("#output").html() + "<br />" + event); 
} 

$elmt = $("#elmt"); 
$elmt.bind("change.namespace1", eventHandler); 
$elmt.bind("change.namespace2", eventHandler); 

$elmt.trigger("change.namespace1"); 
$elmt.trigger("change.namespace2"); 

JSFiddle is here

Necesita extraer el espacio de nombres del evento y activarlo, ya que ambos espacios de nombres se activan para el evento básico de "cambio", lo que casi significa que necesita usar espacios de nombres "solo" o sin espacios de nombres.

Espero que esto ayude un poco.

1

la publicación cruzada de Bind to all namespaces of custom jquery event


Trate triggerAll en lugar de trigger:

(function($) { 
    $.fn.triggerAll = function(topics, data, delimiter) { 
     return this.each(function() { 
      var $this = $(this), chain = [], t = ''; 
      delimiter = (delimiter || '.'); 
      // rebuild chain 
      $.each(topics.split(delimiter), function(i,n) { 
       t += (i == 0 ? '' : delimiter) + n; 
       chain.push(t); 
      }); 

      // append/prepend original topic? 
      data = (data || []); 
      data.push(topics); 
      $.each(chain, function(i,t) { 
       $this.trigger(t, data); 
      }); 
     }); 
    }; 
})(jQuery); 

Por supuesto, debido a la forma en jQuery se encarga de desencadenar los espacios de nombre, que activa el evento "raíz" en realidad dispara las versiones de espacios de nombres , para obtener lo que espera necesitaría usar otro caracter para el delimitador, como /, y luego declarar sus eventos como:

var $o = $('#whatever'); 
// this will be triggered for all events starting with 'root' 
$o.on('root', function() { console.log(Array.prototype.slice.call(arguments, 0)); }); 
// some arbitrary way to fire custom events 
$o.on('click', function() { 
    $o.triggerAll('root/custom1/subA', ['1st', '2nd'], '/'); 
    $o.triggerAll('root/custom2', [3, 4, 5], '/'); 
}); 
+0

whoops ... no del todo bien. un segundo. – drzaus

+0

actualizado para que coincida con la publicación original. – drzaus

0

Esto es lo que he utilizado para comparar tema existente en cada elemento li y reemplazarlo con un nuevo tema personalizado .....

$('li').each(function(index) { 
        var oT = $(this).attr('data-theme'); 
        var li_item = $(this).attr(index); 

        $('#li_item ').mousedown(function() { 

         if(oT=='a') 
         { 
          $(this).removeClass('ui-btn-up-' + a').addClass('ui-btn-up-' + 'c').attr('data-theme', 'c'); 
         } 

        }); 

        $('#li_item ').mouseup(function() { 


         if(oT=='c') 
         { 
          $(this).removeClass('ui-btn-up-' + 'c').addClass('ui-btn-up-' + 'a').attr('data-theme', 'a'); 
         } 

        }); 

});