2010-08-05 57 views
0

如何让一个小部件监听其他小部件的点击,但不听正常的点击。例如: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'); 
    }); 

这应该是“click.btn1.otherWidget”事件是$ dialogWidget解雇的唯一途径。

我可以做的一件事可能是黑客随时可以手动点击点击事件是使用“点击”而不是点击,但这感觉就像一个黑客。有任何想法吗?

+0

很明显,jQuery支持独占事件。所以$ dialogWidget.trigger('click!')只会触发'click'而不是'click.namespace'事件。我需要与此相反的。像$ dialogWidget.bind('click.namespace!'),这意味着只有手动触发这个完全合格的事件的项目会触发这个 – 2010-08-05 22:35:00

回答

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,这附近有很多资源。

+0

再次感谢尼克,我想我只是想看看是否有其他方法可以做到这一点。非常感激 – 2010-08-05 22:57:34

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"); 
    } 
}); 

这可能对你有帮助。