2010-06-04 59 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