jquery命名空间事件

时间:2010-08-05 22:22:11

标签: jquery

如何让小部件侦听其他小部件的点击,但不听取正常的点击次数。例如:

var $dialogWidget = jQuery('#dialogWidget');

$dialogWidget
  .bind('click.btn1.otherWidget',doSomething)
  .bind('click.btn2.otherWidget',doSomething2)
  .bind('click.btn1.otherWidget2',doSomething3);

这段代码的问题是,当我点击$ dialogWidget上的任何地方时,我所绑定的所有这些事件都将被触发。我想要的是这个

var $otherWidget = jQuery('#otherWidget');
var $btn1 = $otherWidget.find('a.btn1');
$btn1
    .click(function(){
        $dialogWidget.trigger('click.btn1.otherWidget');
     });

这应该是$ dialogWidget触发'click.btn1.otherWidget'事件的唯一方法。

我可以做的一件事就是黑客攻击,无论何时我手动触发点击事件都是使用'点击'而不是点击,但这感觉就像一个黑客。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为最简单的解决方案是重命名您的活动,使用未采用的名称。在这种情况下,只是不要使用click,而是这样做:

$dialogWidget
  .bind('myClick.btn1.otherWidget',doSomething)
  .bind('myClick.btn2.otherWidget',doSomething2)
  .bind('myClick.btn1.otherWidget2',doSomething3);

然后当你触发它时:

$dialogWidget.trigger('myClick.btn1.otherWidget');

这是click不会触发您不想以任何其他方式触发的命名空间自定义事件。要明确这不是一个黑客,它是完全正常的 jQuery行为,它在整个jQuery事件模型中有意支持。 Google for jQuery custom events,周围有很多资源。

答案 1 :(得分:2)

您可以在此处使用事件委派,并尝试处理event.target属性的操作。

var $widgets = jQuery('.widget');
$widgets.click(function(event){
  if($(event.target).attr("id") !== "dialogWidget"){
      alert("You won't see this alert if you click on #dialogWidet");
  }
});

这可能会对你有帮助。