javascript循环调用自己

时间:2016-01-04 12:09:00

标签: javascript jquery asp.net

我的代码中的逻辑存在问题,我认为我已经看了太长时间才能找到它。当此代码在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();});

有人可以给我第二双眼睛来帮助我找到造成这种递归行为的原因吗?希望这将是其他人看到问题的足够代码,但我会根据要求提供更多。

2 个答案:

答案 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");
}