JavaScript mouseup事件在单击时多次被触发

时间:2011-11-21 22:24:55

标签: javascript jquery model-view-controller mouseup

有人能告诉我为什么下面的javascript代码会导致一次点击后7次调用renewSession()吗?

$(document).ready(function () {
    $("*").mouseup(function () {
        renewSession();
    });
});

function renewSession() {
    $.ajax({
        url: "/Account/RenewSession",
        type: "POST"
    });
}

2 个答案:

答案 0 :(得分:6)

可能是因为mouseup事件通过DOM树向上传播,并且您正在将处理程序应用于文档中的每个元素。所以它会触发第一个元素,然后触发父元素,依此类推,直到它到达html(或body,我再也不记得每次都检查了。)

您可以使用:

$(document).ready(function () {
    $("*").mouseup(function (e) {
        e.stopPropagation();
        renewSession();
    });
});

防止多次通话。

<小时/> 已编辑以解决来自thiag0的评论:

  

感谢您的快速回复...我每次用户点击网站时都会调用renewSession()以保持会话处于活动状态。此解决方案可防止在单击中多次调用renewSession,但会阻止用户单击的实际意图触发。无论如何要解决这个问题?

您可以定位body元素;只要允许事件通过DOM树传播(只要你没有在点击的元素(或'mouseup'ed)之间的元素上调用event.stopPropagation(),那么事件将传播到body。所以我建议使用:

$(document).ready(function () {
    $("body").mouseup(function () {
        renewSession();
    });
});

答案 1 :(得分:1)

* selctor匹配7个元素......

html中的事件冒泡DOM树,除非明确告知停止,因此将为与选择器匹配的树上的每个元素触发事件(在这种情况下全部都是!)。

如果这不是您的预期行为,请使用更具体的选择器,或调用stopPropagation方法。