当只有一个想要时,Jquery多个事件

时间:2010-12-21 17:05:33

标签: jquery

使用以下html和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;
    });
});

5 个答案:

答案 0 :(得分: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个处理程序,无论是否被该代码或其他东西连接起来,这与其他人没有很好地协作。)

答案 1 :(得分:0)

也许你可以使用event.stopPropagation()

答案 2 :(得分:0)

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

你想达到什么目的?

答案 3 :(得分:0)

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

首先,您可以在再次设置之前取消绑定第二次单击事件:

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

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

另一个更好的解决方案是在第一次点击活动之外附加另一个点击。

答案 4 :(得分:0)

如果你真的想要在第一个处理器中绑定第二个单击处理程序,你可以将第二个处理程序包装到一个函数中,并首先尝试取消绑定此函数:

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

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

但据我所知,这里的主要问题是为什么return false不会阻止事件传播,对吧?这需要进一步的研究,正如我所期望的那样。