2012-04-16 10 views
10

È possibile ascoltare TUTTI gli eventi di un evento di base se gli eventi sono spazi dei nomi?jQuery: bind namespace eventi

Esempio:

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

Funziona solo se mi legano ai nomi evento completo, ma questo è quello che non so su questa posizione :(

+0

cosa stai cercando di fare esattamente? – Evan

+0

Un plug-in jquery attiva eventi di modifica con nome (change.channel, change.selected e altri). Mi piacerebbe fare un'azione se uno degli eventi di cambiamento è stato attivato. Non voglio codificare tutti i possibili spazi dei nomi. –

+0

Ho appena trovato la tua domanda dopo aver postato [il mio] (http://stackoverflow.com/questions/12590231/bind-to-all-names-details-of-custom-jquery-event). Vorrei anche sapere se questo è possibile. – jschr

risposta

1

È possibile, ma non è perfetto.

Ad esempio:.

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

È necessario estrarre lo spazio dei nomi dall'evento e accenderlo, poiché entrambi gli spazi dei nomi vengono attivati ​​per l'evento di base "modifica", il che significa quasi che è necessario utilizzare "solo" spazi dei nomi o nessun spazio dei nomi.

Spero che questo aiuti un po '.

1

cross-posting da Bind to all namespaces of custom jquery event


Prova triggerAll invece di 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); 

scontato, a causa di come jQuery gestisce innescando namespacing, innescando l'evento "root" spara in realtà le versioni namespace , quindi per ottenere ciò che ti aspetti, devi utilizzare un altro carattere per il delimitatore, ad esempio /, quindi dichiarare i tuoi eventi come:

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 ... non proprio giusto. un attimo. – drzaus

+0

aggiornato per abbinare il post originale. – drzaus

0

Questo è quello che ho usato per confrontare tema esistente su ogni elemento Li e sostituirlo con il nuovo tema personalizzato .....

$('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'); 
         } 

        }); 

});