2014-09-20 85 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