2012-04-16 15 views
10

Czy możliwe jest odsłuchiwanie WSZYSTKICH zdarzeń jednego podstawowego zdarzenia, jeśli zdarzenia są przestrzeniami nazw?jQuery: bind namespaces events

Przykład:

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

Zadziała tylko wtedy, wiążę się do pełnych nazw zdarzeń, ale to jest to, czego nie wiem, na tym stanowisku :(

+0

co dokładnie próbujesz zrobić? – Evan

+0

Wtyczka jquery wyzwala zdarzenia związane ze zmianą wielkości liter (change.channel, change.selected i inne). Chciałbym wykonać akcję, jeśli zostanie wywołane jedno ze zdarzeń zmiany. Nie chcę sztywnego kodowania wszystkich możliwych przestrzeni nazw. –

+0

Właśnie natknąłem się na twoje pytanie po tym, jak opublikowałem [moje] (http://stackoverflow.com/questions/12590231/bind-to-all-namespaces-of-custom-jquery-event). Chciałbym również wiedzieć, czy to jest możliwe. – jschr

Odpowiedz

1

Można, ale to nie jest idealne.

np.

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

Musisz wyodrębnić przestrzeń nazw ze zdarzenia i włączyć to, ponieważ obie przestrzenie nazw są uruchamiane dla podstawowego zdarzenia "zmiana", co prawie oznacza, że ​​musisz użyć "tylko" przestrzeni nazw lub bez przestrzeni nazw.

Mam nadzieję, że to trochę pomaga.

1

Trasy wpis z Bind to all namespaces of custom jquery event


Spróbuj triggerAll zamiast 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); 

prawda, ze względu na to, jak jQuery obsługuje wyzwalanie przestrzeni nazw, wyzwalając "root" zdarzenie rzeczywiście wyzwala przestrzeni nazw wersje , więc aby uzyskać to, czego się spodziewasz, musisz użyć innego znaku do separatora, na przykład /, a następnie zadeklaruj swoje wydarzenia, takie jak:

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 ... nie do końca. sekunda. – drzaus

+0

zaktualizowano, aby pasował do oryginalnego wpisu. – drzaus

0

To właśnie użyłem do porównania istniejącego motywu na każdym elemencie li i zastąpić nowym niestandardowego tematu .....

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

        }); 

});