2011-11-21 103 views
1

有人能告诉我为什么下面的JavaScript代码导致renewSession()在单击后被调用7次吗?JavaScript mouseup事件正在多次点击单点击

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

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

从性能和维护的角度来看,*选择器并不好。 –

回答

6

也许这是因为mouseup事件通过DOM树向上传播,而你在文档中应用处理程序元素。所以它会触发第一个元素,然后是父级,直到它到达html(或body,如果不经常检查,我永远都不会记得)。

你可以使用:

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

为了防止多次调用。


编辑从thiag0地址评论:

感谢您的快速反应...什么,我试图做的是调用renewSession()每次在网站上的用户点击,以保持会议还活着。此解决方案可以防止一次点击多次调用renewSession,但会阻止用户点击的实际意图触发。无论如何要解决这个问题?

您可以只瞄准body元素;只要允许事件通过DOM树进行传播(只要不在元素之间调用event.stopPropagation()点击(或'mouseup'-ed)),那么事件就会传播到body。我建议使用:

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

感谢您的快速响应...我试图做的是每次用户点击该网站时都会调用renewSession()以保持会话的活跃。此解决方案可以防止一次点击多次调用renewSession,但会阻止用户点击的实际意图触发。任何方式来解决这个问题? – thiag0

+0

@ thiag0,请参阅已编辑/更新的答案。 –

+0

@DavidThomas很好的答案和快速更新! +1 –

1

的* selctor匹配7元......

在HTML冒泡DOM树活动,除非明确告知停止,因此该事件将触发对每个元素向上匹配选择器的树(在这种情况下,它们都是!)

如果这不是你想要的行为我要么使用更具体的选择器,要么调用stopPropagation方法。

+0

感谢您的快速响应...我试图做的是每次用户点击该网站时都会调用renewSession()以保持会话的活跃。此解决方案可以防止一次点击多次调用renewSession,但会阻止用户点击的实际意图触发。任何方式来解决这个问题? – thiag0