2014-09-20 90 views
0

我一直坚持以下情况。canjs:事件触发器中的非选择器

1st我将点击事件处理程序添加到页面的所有元素,它调用一个小的弹出窗口。我无法从这个*选择器中分离弹出窗口,因此它会打开弹出窗口,等等。

我已经试过如下:

var controller = can.Control.extend({ 
    '*:not(.popup *) click': function(el, event) { //This does not work 
     $(el).openPopUp() 
     //pseudo code, opens the popup in to <div class"popup"><input /><input /></div> 
    }, 
}); 
var c = new controller('body'); 

是否有隔离这个问题的任何提示。真正需要的点击处理程序内弹出的元素旁边的所有其他元素, 此致 科瓦莱宁

回答

1

我认为你需要做的是点击事件处理程序附加的身体和一个点击事件处理到.popup。 body click处理程序将打开弹出窗口。 .popup点击处理程序将捕获该事件,以便它不会传播到body元素。

var controller = can.Control.extend({ 
    'click': function ($el, event) { 
     /* open popup now */ 
    }, 
    '.popup click': function ($el, event) { 
     event.stopPropagation(); 
    } 
}); 
+0

我得到了一个AHA时刻。订单确实很重要。事件是一个队列,浏览器按照代码中给出的顺序抓取所有事件。 如果两个处理程序都连接到相同的元素,如果首先执行Click处理程序并在此之后它通过.popup点击处理程序。 event.stopPropagation是可以的,但我认为我需要去除其他处理程序,同时我正在处理弹出窗口。 – 2014-09-23 11:14:58

+0

事件从目标到其父母“气泡”。如果.popup被点击,那么.popup点击处理程序将运行,并且(如果事件没有停止传播),body click处理程序将在之后运行。 – 76484 2014-09-24 02:18:03