2012-04-16 45 views
10

是否有可能来听一个基本事件的所有事件,如果事件是命名空间?jQuery的:绑定命名空间的事件

例子:

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

这只能如果我绑定到完整的活动名称,但是这是不知道在这个位置:(

+0

究竟是你想怎么办? – Evan 2012-04-16 15:41:52

+0

一个jQuery插件触发命名空间变化事件(change.channel,change.selected等)。如果其中一个变更事件已经触发,我想要采取行动。我不会硬编码所有可能的命名空间。 – 2012-04-16 15:47:45

+0

在你的问题就来了,我张贴[矿]后(http://stackoverflow.com/questions/12590231/bind-to-all-namespaces-of-custom-jquery-event)。我也想知道这是可能的。 – jschr 2012-09-25 20:04:57

回答

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 is here

你需要从事件中提取命名空间和上,虽然切换,既命名空间为基本的“改变”事件几乎意味着你需要使用“唯一”的命名空间,或者没有命名空间解雇。

我希望这有助于一点。

1

交叉张贴从Bind to all namespaces of custom jquery event


尝试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], '/'); 
}); 
+0

哎呦......不太对。 1秒。 – drzaus 2013-02-21 02:45:44

+0

更新,以匹配原来的职位。 – drzaus 2013-02-21 03:39:01

0

这是我用来比较各种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'); 
         } 

        }); 

});