我的代码中的逻辑有问题,我想我已经看它太久了才找到它。当此代码在 30 秒超时后执行时,根据调试器,它似乎递归地调用 checkActivityStop,并向 reset.aspx 发出大量 get 请求。
更大的图片是我有 javascript 尝试匹配 asp.net session 变量的时间。当 session 变量即将过期时,我为 body 标记设置了一个单击和按键处理程序,该处理程序会导致向虚拟页面发出 get 请求,该页面“应该”导致刷新 session 变量。
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();});
有人可以给我第二双眼睛来帮助我找到导致这种递归行为的原因吗?希望这足以让其他人看到问题,但我会根据要求提供更多内容。
最佳答案
您需要传递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");
}
关于javascript循环调用自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34590832/