代码之家  ›  专栏  ›  技术社区  ›  Praveen Prasad

处理jquery中的事件冒泡

  •  0
  • Praveen Prasad  · 技术社区  · 16 年前

    IAM具有如下所示的链接

    <a item='1' href='javascript:void(0)'><img class='icon1' /><span>text1</span></a>
    <a item='1' href='javascript:void(0)'><img class='icon2' /><span>text2</span></a>
    <a item='1' href='javascript:void(0)'><img class='icon3' /><span>text3</span></a>
    <a item='1' href='javascript:void(0)'><img class='icon4' /><span>text4</span></a>
    
    
    $(function(){
    $('a').click(_handleClick);
    });
    
    function _handleClick(e)
    {
    var _item=$(e.target).attr('item');
    // do something with _item variable
    }
    

    //现在我的问题是,当用户单击在“handleclick is image”中接收到的图像“e”时,我无法读取attr='item',因此如何使事件冒泡以读取该值。

    3 回复  |  直到 16 年前
        1
  •  2
  •   user113716    16 年前

    您根本不需要对事件冒泡进行任何处理,因为附加了事件处理程序的“a”元素也存储了“item”属性。在这种情况下,您只需使用“this”来引用带有click事件的项,并且$(this).attr(“item”)将检索“item”的值。

    这条线:

    var _item=$(e.target).attr('item');
    

    应该是:

    var _item=$(this).attr('item');
    

    编辑:澄清第一句话,并添加以下信息:

    为了澄清,jquery中的事件冒泡是自动的。如果单击元素的子元素,则事件将一直冒泡到顶部,并按顺序激发事件。

    有时你需要停止射击 event.stopPropagation() .

    有时它也很有用。例如,考虑一个有100个子级的“div”,所有子级都应该接收相同的click事件。您可以将一个click事件分配给父级,然后使用event.target来确定实际单击的是哪个事件,而不是消耗为这100个子级维护事件处理程序所需的所有资源。

    这种方法的另一个好处是,在动态地向父级添加其他子级时,不必使用live()。因为它们都会因为冒泡而触发父级的单击事件,所以它们准备好了。

        2
  •  1
  •   Nick Craver    16 年前

    尝试此操作,而不是直接执行单击目标:

    $(function(){
      $('a').click(function() {
        var _item = $(this).attr('item');
        // do something with _item variable        
      });
    });
    

    尽管 click 在所有父元素上激发事件, e.target 仍然是单击的源,您单击的最深的原始子项…jquery $(this) 处理这个问题,无需担心下面哪个子元素激发了它。

        3
  •  0
  •   Leventix    16 年前

    var _item=$(e.target).parents('a').attr('item');