代码之家  ›  专栏  ›  技术社区  ›  Mechlar

jQuery:如何停止绑定函数而不是整个事件的传播?

  •  2
  • Mechlar  · 技术社区  · 15 年前

    所以我的问题是:有没有办法阻止事件将调用的方法的事件冒泡,而不是整个事件的冒泡?


    聪明的约翰,但问题是。

    <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>
    

    2 回复  |  直到 14 年前
        1
  •  4
  •   John Hartsock    15 年前

    试试这样的

    $(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.
      }
    });
    
        2
  •  1
  •   donquixote    14 年前

    evt.target == evt.currentTarget
    

    这很好,但在有些情况下,这是没有帮助的。


    mousemove事件来自列表项中的链接,该链接是ul列表的子项,而ul列表又是另一个列表项的子项。具有子菜单的html菜单结构的典型示例。
    target将是link标记,但我们对列表项上的mousemove感兴趣。
    更糟糕的是:link标记可能包含span或img标记或其他嵌套的内容。那么evt.target就是这个span或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).parents().is($menu),但是我没有让它工作。另外,我猜这个带有element.tagName的显式循环速度更快。