2011-05-30 80 views
4

我工作的一个div(父),有其他两个div(菜单和内容)如下:确保特定的setInterval函数实例运行一次

<div id="parent"> 
    <div id="menu"></div> 
    <div id="content"></div> 
</div> 

内容在内容加载的div是一个具有几个JavaScript功能的html文件,例如每5秒重新加载其内容的自动刷新。

$(document).ready(function() { 
    setInterval(function() { 
    grid.reloadDefaultContent(); //this reloads the content on content div. 
    }, 5000); 
} 

页面上有一些链接将不同内容加载到内容div中。到目前为止,这很好,直到我回到具有自动刷新功能的“家”。问题是自动刷新从来没有停止过,现在我点击返回到家中,该功能运行两次(或多少次我改变页面并回到家中),将会话放在上面。 我使用jQuery $.load()加载页面。

关于如何让setInterval的实例运行的任何想法只运行一次?

编辑:在阅读我自己的问题后,我看到它有点不清楚。我的主要问题是,当我回到家时,我的第一个setInterval实例已经在运行,并且第二个实例开始运行,使得自动刷新速度提高了5秒,并且每次我都会更快更快地运行更改页面并返回主页。这不是我想要的行为。我需要的是在更改div上的内容时停止setInterval的实例,并在我回到主页时重新启动它。

+0

“独立于用户更改页面/ div内容”是什么意思?目前还不清楚与定时器问题有什么关系。 – Pointy 2011-05-30 19:10:55

+0

如何定义'grid'?它是全球性还是内部封闭? – 2011-05-30 19:10:56

+0

@Pointy:我把它当作“我没有选择使用'setTimeout'而不是'setInterval'”。但我可能是错的... – 2011-05-30 19:11:35

回答

5

这应做到:

var interval; // make sure that is defined outside of the loaded div content 
$(document).ready(function() { 
    if (typeof interval != "number"){ 
     interval = setInterval(function() { 
     grid.reloadDefaultContent(); 
    }, 2000); 
    } 
}); 

它只会启动间隔定时器的一个实例。

2

如果您只希望它运行一次,为什么不直接使用“setTimeout()”呢?

试试这个:

$(document).ready(function() { 
    if (!$('body').hasClass('refresh-started')) { 
    setInterval(function() { 
     grid.reloadDefaultContent(); //this reloads the content on content div. 
    }, 5000); 
    $('body').addClass('refresh-started'); 
    } 
} 

另一种方法是永远重新开始而不是计时器:

$(document).ready(function() { 
    clearInterval($('body').data('refresh-interval')); 
    $('body').data('refresh-interval', setInterval(function() { 
    grid.reloadDefaultContent(); //this reloads the content on content div. 
    }, 5000)); 
}); 

哪一个更好取决于您的具体情况。

+0

如果我正确理解他的问题,该JavaScript通过ajax负载添加到页面。他确实希望它以间隔方式工作,但不希望每次有人在同一会话期间用ajax加载打开该选项卡/页面时,都会重复启动它。 – Niklas 2011-05-30 19:07:55

+0

是的Niklas,我终于明白了。谢谢:-) – Pointy 2011-05-30 19:09:02

+0

不幸的是,“不依赖于用户更改页面/ div内容” – 2011-05-30 19:09:39

0

如果你想让你的代码只运行一次,你应该使用setTimeout()而不是setInterval()

0

用户jQuery的.one()功能

描述:附加的处理程序到 事件中的元素。每个元素最多执行一次处理程序 。

$("#foo").one("click", function() { 
    alert("This will be displayed only once."); 
}); 
0

不改变做setInterval的源代码页,你唯一的选择似乎是破解grid.reloadDefaultContent函数使它只运行一次。没有看到如何定义grid就不可能提供任何建议。

相关问题