Javascript setTimeout在ajax加载的页面中激发的次数与页面中激发的次数相同
我正在通过ajax调用加载的页面中执行setTimeout函数。但是,如果我再次单击链接加载页面,恐怕最后一个setTimeout调用仍会继续,并且setTimeout设置的调用间隔数会执行多次 这是远程页面:Javascript setTimeout在ajax加载的页面中激发的次数与页面中激发的次数相同,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,我正在通过ajax调用加载的页面中执行setTimeout函数。但是,如果我再次单击链接加载页面,恐怕最后一个setTimeout调用仍会继续,并且setTimeout设置的调用间隔数会执行多次 这是远程页面: var RefreshInterval = null; clearTimeout(RefreshInterval); function someFunction() { .... setNextRefresh(); } function setNextRefresh() {
var RefreshInterval = null;
clearTimeout(RefreshInterval);
function someFunction()
{
....
setNextRefresh();
}
function setNextRefresh() {
console.log(wifiRadarRefreshInterval);
RefreshInterval = null;
clearTimeout(RefreshInterval);
RefreshInterval = setTimeout('someFunction();', 20*1000);
}
声明
var RefreshInterval=null代码>在ajax加载的页面之外,并在页面上使用以下代码:
clearTimeout(RefreshInterval);
function someFunction()
{
....
setNextRefresh();
}
function setNextRefresh() {
console.log(wifiRadarRefreshInterval);
clearTimeout(RefreshInterval);
RefreshInterval = setTimeout('someFunction();', 20*1000);
}
不要用这个
var RefreshInterval = null;
clearTimeout(RefreshInterval);
实际上,您正在分配一个空值,然后试图清除它。这将不起作用,必须使用clearTimeout
并通过传递分配给setTimeout的变量来清除超时。在这里,您将传递一个空值,因此计时器永远不会被清除
下面是一个小示例,它将演示如何解决您的问题
因此,与其将变量设置为null然后尝试清除它,只需检查变量是否未定义,如果已定义,则清除它,否则继续。使用下面的代码,还必须删除上面提到的两行
function setNextRefresh() {
console.log(wifiRadarRefreshInterval);
if (typeof RefreshInterval !== 'undefined') {
clearTimeout(RefreshInterval);
}
RefreshInterval = setTimeout('someFunction();', 20*1000);
}
点击按钮4次,输出只打印一次。也就是说,如果ajax调用是设置的超时的4倍,则只能执行一次。检查下面的代码片段以获取演示
var clickCount=0;//只是为了保持ajax调用的数量
函数NewPageSimilator(clicksTillNow){//这将充当一个新页面。让我们在ajaX调用中加载整个内容
如果(刷新间隔的类型!=='undefined'){
清除超时(刷新间隔);
}
函数setNextRefresh(){
window.RefreshInterval=setTimeout(打印时间,3000);//20*1000
}
函数printTime(){//dumy函数用于打印时间
document.getElementById(“输出”).innerHTML+=“我是在单击编号“+clicksTillNow+”
时创建的”;
}
setNextRefresh();
}
document.getElementById(“ajaxCall”).addEventListener(“单击”,function(){//这将通过再次加载脚本充当ajax调用
点击计数++;
新建页面模拟器(单击计数);
});
document.getElementById(“clear”).addEventListener(“单击”,函数(){//reset演示
点击计数=0;
document.getElementById(“输出”).innerHTML=“”;
});代码>
AJAX调用
清楚的
如果我不想在父页面中声明它,下面是我找到的解决方案:
//Clear previously loaded calls if exists
try{ clearTimeout(wifiRadarRefreshInterval); }catch(e){}
var wifiRadarRefreshInterval = null;
function somefunction(){
....
setNextRefresh();
}
function setNextRefresh() {
try{
clearTimeout(wifiRadarRefreshInterval);
wifiRadarRefreshInterval = null;
wifiRadarRefreshInterval = setTimeout('somefunction();', 20*1000);
}
catch(e){
console.log(e.message + e.stack);
}
}
你能摆弄一下吗?做RefreshInterval=null;清除超时(刷新间隔)代码>?如果RefreshInterval
为空,则无法清除以前的超时我发现,一旦某些浏览器的此技巧不适用于clearTimeout()@AmitShah setTimeout将返回可用于clearTimeout的id(一个数字),如果设置为空,则clearTimeout不知道清除什么。谢谢@Reddy,但我使用的是“使用严格”。所以必须首先声明变量。