我的代码中的逻辑存在问题,我认为我已经看了太长时间才能找到它。当此代码在30秒超时后执行时,根据调试器,它似乎递归调用checkActivityStop,并向reset.aspx发出大量get请求。
更大的图片是我有javascript尝试匹配asp.net会话变量的时间。当会话变量即将到期时,我为body标签设置了一个click和key press处理程序,它将get请求输出到一个“应该”导致会话变量被刷新的虚拟页面。
var sessionTime = 0;
var session;
var sessionTimer;
function resetSession() {
$.get("reset.aspx", function (data) {
$("#dbCheck").html(data);
if ($("#resetSession").length) {
clearSessionTimeout();
setSessionTimeout();
//alert("session reset");
}
});
}
function checkActivityStart() {
$("body").bind("click", resetSession());
$("body").bind("keypress", resetSession());
console.trace("checking activity");
}
function checkActivityStop() {
$("body").unbind("click", resetSession());
$("body").unbind("keypress", resetSession());
console.trace("stopping activity");
}
function setSessionTimeout() {
sessionTimer = setTimeout(function () { checkActivityStart(); }, 30000);
}
function clearSessionTimeout() {
clearTimeout(sessionTimer);
checkActivityStop();
sessionTime = 0;
}
$(document).ready(function () {
setSessionTimeout();});
有人可以给我第二双眼睛来帮助我找到造成这种递归行为的原因吗?希望这将是其他人看到问题的足够代码,但我会根据要求提供更多。
答案 0 :(得分:2)
您需要传递resetSession
的函数引用,而不是调用函数resetSession()
并使用其返回值即undefined
作为单击处理程序。
$("body").bind("click", resetSession);
而不是
$("body").bind("click", resetSession());
更新以下功能
function checkActivityStart() {
$("body").bind("click", resetSession);
$("body").bind("keypress", resetSession);
console.trace("checking activity");
}
function checkActivityStop() {
$("body").unbind("click", resetSession);
$("body").unbind("keypress", resetSession);
console.trace("stopping activity");
}
答案 1 :(得分:1)
所有这些.bind()
函数都是函数引用。但是您已将它们添加为函数返回值。请删除()
:
function checkActivityStart() {
$("body").bind("click", resetSession);
$("body").bind("keypress", resetSession);
console.trace("checking activity");
}
function checkActivityStop() {
$("body").unbind("click", resetSession);
$("body").unbind("keypress", resetSession);
console.trace("stopping activity");
}