代码之家  ›  专栏  ›  技术社区  ›  Adrian Adkison

jquery命名空间事件

  •  0
  • Adrian Adkison  · 技术社区  · 14 年前

    如何让一个小部件侦听其他小部件上的单击,而不侦听自身上的正常单击。例如:

    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”事件的唯一方法。

    我可以做的一件可能的事情就是黑客攻击,即任何时候我手动触发一个click事件都是使用“clicked”而不是click,但这感觉像是黑客攻击。有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Nick Craver    14 年前

    我认为最简单的解决方案是重命名事件,使用一个没有使用的名称。在这种情况下,不要使用 click ,改为执行以下操作:

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

    当你触发它时:

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

    这是 点击 完全正常 jQuery行为,在整个jQuery事件模型中都有意支持它。 Google for jQuery custom events

        2
  •  2
  •   Sinan    14 年前

    您可以在这里使用事件委托,并尝试通过 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");
      }
    });