2010-06-04 61 views
2

我有一個點擊功能綁定到許多元素。有時這些元素可能會彼此坐在一起。所以,click事件綁定到一個孩子,並綁定到它的父代。該方法特定於單擊的元素。自然,由於事件冒泡,孩子的事件首先被解僱,然後父母被解僱。我不能同時打電話給他們,因爲父母事件會覆蓋孩子的事件。所以我可以使用event.stopPropagation(),所以只有第一個元素點擊接收事件。問題是還有其他點擊事件附加到元素,例如,我在這些元素上使用jQuery的可拖動。如果我停止傳播click事件,則可拖動不起作用,並且不會調用以下點擊事件。jQuery:如何停止綁定函數的傳播而不是整個事件?

所以我的問題是:有沒有辦法阻止事件將調用的方法事件冒泡而不是整個事件?


輝煌的約翰,但這裏是概率。

<div id="Elm1"><!-- relative --> 
<div class="Elmchildren"></div><!-- absolute--> 
<div class="Elmchildren"></div><!-- absolute--> 
<div class="Elmchildren"></div><!-- absolute--> 

<div id="Elm2"><!-- relative --> 
    <div class="Elmchildren"></div><!-- absolute--> 
    <div class="Elmchildren"></div><!-- absolute--> 
    <div class="Elmchildren"></div><!-- absolute--> 
</div> 

</div> 

單擊事件綁定到#Elm1和#Elm2。兒童的寬度和高度都是100%。所以他們實際上是目前的目標。

回答

4

嘗試成才這樣

$(mySelector).click(function(evt) { 
    if (evt.target == evt.currentTarget) { 
     ///run your code. The if statment will only run this click event on the target element 
     ///all other click events will still run. 
    } 
}); 
+0

我發佈了我的答覆作爲新答案,以便您可以看到HTML。看下面 – UpHelix 2010-06-04 20:52:45

+1

e和evt不匹配 – 2010-06-04 21:06:09

+0

@Mark,是的。 @John,一些newby可能會花費幾個小時...你可能想爲此編輯它:D – UpHelix 2010-06-04 21:17:34

1

建議的解決方案

evt.target == evt.currentTarget 

是好的,但也有情況下,它並不能幫助。

示例:具有嵌套的ul/li列表的(suckerfish樣式)菜單結構。
mousemove事件來自列表項中的鏈接,該列表項是ul-list的子項,它又是另一個列表項的子項。通常用於具有子菜單的html菜單結構。
evt.target是鏈接標記,但我們對列表項中的mousemove感興趣。
更糟:鏈接標記可能包含span或img標記或其他嵌套的東西。然後evt.target就是這個跨度或img。

這裏似乎工作的是在父項/根項目上捕獲事件,然後檢查evt.target的父項。

像這樣(用jQuery),

var $menu = $('div#menu'); 
$('body').mousemove(function(evt){ 
    var element = evt.target; 
    // find the deepest list item that was affected by this mouseover event. 
    var list_item; 
    var in_menu = false; 
    while (element) { 
    if (element == $menu[0]) { 
     in_menu = true; 
     break; 
    } 
    else if (!list_item && element.tagName == 'LI') { 
     // we found a list item, but we are not sure if we are inside the menu tree. 
     list_item = element; 
    } 
    } 
    // do something with the result. 
    if (!in_menu) { 
     .. // close all submenus 
    } 
    if (list_item) { 
    .. // open the submenu for this list item. 
    } 
    else { 
    // mouse in menu, but not hovering an item. 
    // leave the submenus open. (?) 
    } 
}); 

也許一些,這可能與jQuery()。縮寫如$(evt.target)。家長是($菜單),但我沒有得到這工作。另外,我想這與element.tagName顯式循環更快。

+0

我想象只有一個稍微複雜的$('body')。mouseover()會比$('li',$ menu).mouseover()加上$ menu.mouseover()加$('body')。mouseover()。 我還沒有做任何基準(並沒有多少想法,我會如何開始)。 – donquixote 2011-08-01 01:15:46