我认为这就是你想要的:
//only run if on home page
if (url == 'Home' || url == '' || url == 'home' || url == 'home.html' || url == 'Home.html'){
//set up interval handler for cancellation when not on home
var handle= setInterval(function(){newsCheck()},1000);
// ...
}
编辑:鉴于您正在使用 HTML5 历史 API 更改代码,我认为您需要的是:
// Set up the handle globally, because you won't have a history event triggered right away
var handle = setInterval(function(){newsCheck()},1000);
// Cancel it right away if you're not on the home page
if (url != 'Home' && url != '' && url != 'home' && url != 'home.html' && url != 'Home.html') {
clearinterval(handle);
}
// Listen for history API events
window.addEventListener('popstate', function(event) {
// Check the new url
if (url == 'Home' || url == '' || url == 'home' || url == 'home.html' || url == 'Home.html') {
// On the home page now, so set up the interval
// And we're inside an anonymous function now, so scope the handle to the window
window.handle = setInterval(function(){newsCheck()},1000);
} else {
// Not on the home page now, so clear the interval
// No guarantee that the interval exists at this point
if(window.handle)
clearinterval(window.handle);
}
});
而且我认为您需要为“pushstate”事件侦听器做类似的事情,但是我对这件事有点模糊,所以您只需尝试一下即可。
原始回复
几个指针。
setInterval
现在是大多数浏览器的javascript实现中的本机代码。您不需要在任何地方进行范围。请参阅MDN上的文档和示例。
- 您不需要清除主页以外的页面上的间隔。主页以外的页面应该设置它。
- 每秒一次的 Ajaxing 新闻非常疯狂。一旦你解决了代码,我强烈建议移到更长的时间间隔。您的服务器和您的计算机速度慢、延迟高或互联网服务差的用户会感谢您。
- 根据你从哪里得到
url
,它可能完全是假的。您是否验证过它具有正确的价值?您确定要与之比较的所有值都是可能性吗?
此外,MDN 对从间隔调用的长时间运行的操作有这样的说法:
危险使用
如果您的逻辑执行时间可能比间隔时间长,建议您使用 window.setTimeout 递归调用命名函数。例如,如果使用 setInterval 每 5 秒轮询一次远程服务器,网络延迟、服务器无响应以及许多其他问题可能会阻止请求在分配的时间内完成。因此,您可能会发现排队的 XHR 请求不一定按顺序返回。
对于这种情况,首选递归 setTimeout 模式:
(function loop(){
setTimeout(function(){
// logic here
// recurse
loop();
}, 1000);
})();
在上面的代码片段中,声明了一个命名函数循环并立即执行。逻辑完成执行后,在 setTimeout 内递归调用循环。虽然此模式不保证在固定间隔上执行,但它确实保证前一个间隔在递归之前已经完成。
我建议从 AJAX 完成回调中为下一个 newsCheck() 调用设置超时。这样它仍然是异步的,你不可能一次触发多个请求。