在我们的工作中,我们使用的通信门户网站会在一段时间后注销。我的一些同事要求我提供JavaScript,以禁用自动注销功能。我所能实现的只是重置displayes计时器,但是计时器本身始终保持运行。计时器的启动方法如下:
<body class='asam_body' onLoad='window.setTimeout("DsplTime()",1);' >
如您所见,setTimeout在onLoad上调用,但是没有对setTimeout调用的引用,因此我不能使用clearTimeout()函数。我也尝试过从脚本中调用DsplTime(),但这仍然不能停止计时器。我发现的所有内容均不适用于我的案件,因此两个小时后我放弃了搜索。
有什么方法可以影响此服务器端主体定义,例如通过
覆盖onLoad(使用@ document-start尝试)
将字符串替换为主体本身的定义(我想是因为服务器将其传送到行的末尾,以供我的脚本注入)
追溯获取setTiming-Object的引用
这是我相当无用的方法,只会重置显示的时间:
setInterval(CalcTime, 130000);
setInterval(resetStart, 130000);
setInterval(DsplTime, 130000);
//resetStart and CalcTime are prefined functions,
// without any impact on the timer itself, unfortunately
提前致谢!
附言:那是我第一次在stackoverflow上问问题,所以我希望我能适当地问一下:)
编辑:
我尝试了Cancel all Javascript's setTimeouts and setIntervals中的蛮力方法,
for (var i = 1; i < 99999; i++) {
window.clearInterval(i);
window.clearTimeout(i);
window.mozCancelAnimationFrame(i); // Firefox
}
但是,经过相同的时间后,我仍然注销了。
在1440分钟后,此代码隐藏导致注销:
if (absSec >= 1440)
{
document.location.href = "../project/auth/logout.php";
}
这是上面提到的函数DsplTime()的一部分。有什么方法可以操纵此函数,而不是阻止它被调用? absSec不在范围内,因此我无法更改其值(而且我认为这仍然无济于事吗?
编辑2:
所以我可以设法通过停止计时器
// @run-at document-start
//...
var highestTimeoutId = setTimeout(";");
for (var i = 0 ; i < highestTimeoutId ; i++) {
window.clearTimeout(i);
// window.alert(i);
}
不幸的是,该脚本仅偶尔运行(大约占页面加载的80%)。另外,这不是为服务器带来很多负载吗?我不想被封锁...
最佳答案
为什么不只是覆盖javascript函数DsplTime()而不使您注销呢?
进入调试控制台,输入DsplTime = new function(){}之类的内容
当间隔和DsplTime()结束时,该函数将不执行任何操作。