JQuery: связывать пространства имен

Можно ли прослушивать ВСЕ события одного основного события, если события являются пространствами имен?

Пример:

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

Это работает только в том случае, если я связываюсь с полными именами событий, но это то, чего я не знаю в этой позиции: (

Ответ 1

Вы можете, но это не идеально.

Например:

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 здесь.

Вам нужно извлечь пространство имен из события и включить его, хотя, поскольку оба пространства имен запускаются для основного события "изменения", что почти означает, что вам нужно использовать "только" пространства имен или без пространств имен.

Надеюсь, это немного поможет.

Ответ 2

Перекрестная проводка из Привязка ко всем пространствам имен пользовательского события jquery


Попробуйте triggerAll вместо 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);

Конечно, из-за того, как jQuery обрабатывает запуск пространства имен, запуск "корневого" события фактически запускает версии с именами, поэтому, чтобы получить то, что вы ожидаете, вам понадобится использовать другой символ для разделителя, например /, а затем объявите свои события следующим образом:

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], '/');
});

Ответ 3

Это то, что я использовал для сравнения существующей темы для каждого элемента li и замены новой пользовательской темой.....

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

                    });

});