当只需要一个事件时,Jquery可以处理多个事件
在下面的html和jQuery中,如果我多次单击第一个锚点,然后单击列表锚点,则会显示警报消息,显示的是我单击第一个锚点的次数。为什么会这样?我如何阻止它发生当只需要一个事件时,Jquery可以处理多个事件,jquery,Jquery,在下面的html和jQuery中,如果我多次单击第一个锚点,然后单击列表锚点,则会显示警报消息,显示的是我单击第一个锚点的次数。为什么会这样?我如何阻止它发生 <div> <a href="#">click me</a> <ul style="display:none"> <li><a href='#'>now click me</a></li> </ul
<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;
});
});
$('div>a')。单击(函数(e){
e、 预防默认值();
$(this).next().show().find('a')。单击(function(){
警报(“来自内部单击的警报”);
返回false;
});
});
因为每次调用锚点的单击处理程序时,您都在连接另一个锚点的事件处理程序的另一个实例。大概你只想连接一次,但不知道你到底想做什么
如果您试图在单击第一个锚点时更改第二个锚点上发生的情况,则可以首先从锚点解除所有单击处理程序的绑定,如下所示:
$('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;
});
});
…但我怀疑,如果对总体目标有更好的了解,就会有更好的解决方案。(上面的一个问题是,它从锚中删除了所有的点击处理程序,无论是由该代码连接的还是其他与其他锚不好的处理程序连接的。)因为每次调用锚的点击处理程序时,您都在连接另一个锚的事件处理程序的另一个实例。大概你只想连接一次,但不知道你到底想做什么
如果您试图在单击第一个锚点时更改第二个锚点上发生的情况,则可以首先从锚点解除所有单击处理程序的绑定,如下所示:
$('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;
});
});
…但我怀疑,如果对总体目标有更好的了解,就会有更好的解决方案。(上面的一个问题是,它从锚中删除了所有的单击处理程序,无论是由该代码还是其他什么连接的,这都不会很好地与其他处理程序配合。)也许您可以使用也许您可以使用发生这种情况是因为您每次单击第一个链接时都会在列表中的锚上绑定一个单击事件
您希望实现什么?这是因为每次单击第一个链接时,您都会在列表中的锚上绑定一个单击事件
您希望实现什么?基本上,当您单击第一个链接时,会将新的单击事件附加到嵌套链接。有两种解决方案
首先,可以在再次设置第二次单击事件之前解除其绑定:
$('div > a').click(function(e) {
e.preventDefault();
$(this).next().show().find('a')
.unbind('click')
.click(function() {
alert("alert from inner click");
return false;
});
});
另一个更好的解决方案是在第一次单击事件之外附加另一个单击。基本上,当您单击第一个链接时,您会将一个新的单击事件附加到嵌套链接。有两种解决方案
首先,可以在再次设置第二次单击事件之前解除其绑定:
$('div > a').click(function(e) {
e.preventDefault();
$(this).next().show().find('a')
.unbind('click')
.click(function() {
alert("alert from inner click");
return false;
});
});
另一个更好的解决方案是将另一个单击附加到第一个单击事件之外。如果确实要将第二个单击处理程序绑定到第一个单击事件内,可以将第二个处理程序包装到函数中,然后首先尝试解除绑定此函数:
$(this).next().show().find('a')
.unbind("click", someFunction)
.click(someFunction);
您还可以在第二个处理程序中将某个标志设置为true,以检查它之前是否被调用
但就我所见,这里的主要问题是为什么return false
不停止事件传播,对吗?这需要进一步研究,正如我所预期的那样。如果您确实希望将第二个单击处理程序绑定到第一个处理程序中,可以将第二个处理程序包装到函数中,然后首先尝试解除绑定此函数:
$(this).next().show().find('a')
.unbind("click", someFunction)
.click(someFunction);
您还可以在第二个处理程序中将某个标志设置为true,以检查它之前是否被调用
但就我所见,这里的主要问题是为什么return false
不停止事件传播,对吗?这需要进一步的研究,因为我希望它能起作用