2010-12-21 29 views
0

使用下面的html和jQuery,如果我多次点击第一个锚点然后点击列表锚点,我会看到警告消息显示的次数是我点击第一个锚点的次数。为什么是这样?我如何阻止它发生?当只有一个人需要时Jquery多个事件

<div> 
    <a href="#">click me</a> 
    <ul style="display:none"> 
     <li><a href='#'>now click me</a></li> 
    </ul> 
</div> 


$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a').click(function() { 
     alert("alert from inner click"); 
     return false; 
    }); 
}); 

回答

3

因为每对锚的点击处理程序被调用时,你钩住为其他锚的事件处理程序的另一个实例。想必你只想连接一次,但不知道更多关于你想要实际做什么......

如果你想更改当你点击第一个按钮时会发生什么,你可以从锚解除绑定所有click处理程序首先,像这样:

$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a').unbind('click').click(function() { 
     // New bit is here.........^^^^^^^^^^^^^^^^ 
     alert("alert from inner click"); 
     return false; 
    }); 
}); 

...但我的总体目标更好的主意怀疑,就不会有一个更好的解决方案。 (上述的一个问题是,它会删除所有click处理来自锚,无论是通过该代码或别的东西,这是不与别人很好地玩上勾搭上了)

0

发生这种情况的原因是,每次单击第一个链接时,都会在列表中的锚点上绑定单击事件。

你想实现什么?

0

基本上,当您单击第一个链接时,将新的单击事件附加到嵌套链接。有两种解决方案。

首先你可以再次设置它之前解除绑定的第二次点击事件:

$('div > a').click(function(e) { 
    e.preventDefault(); 

    $(this).next().show().find('a') 
     .unbind('click') 
     .click(function() { 
      alert("alert from inner click"); 
      return false; 
     }); 
}); 

其他更好的解决办法是附加的第一个点击事件以外的其他点击。

0

,如果你真的想第一个内第二次点击处理程序绑定,你可以用第二个处理器连接到一个功能,并首次尝试解除绑定此功能:

$(this).next().show().find('a') 
    .unbind("click", someFunction) 
    .click(someFunction); 

你也可以设置一些标志在第二个处理程序中检查它是否在之前被调用。

但据我看到这里的主要问题是为什么return false不停止事件传播,对不对?这需要进一步的研究,正如我预计的那样。

相关问题