[英]jQuery/Javascript: setInterval check if DOM element exists?
[英]javascript to check if element visible and set “setInterval” accordingly
LE2。 关于如何解决这个问题的任何其他想法?
我有这个代码,无法解释为什么不能正常工作:
$(function autorun() {
if ($("#contactForm").is(":visible")){
setInterval( "refreshAjax();", 150000000000 );
}
else {
setInterval( "refreshAjax();", 15000 );
}
setTimeout("autorun();", 2000)
});
...
<body onLoad="autorun()">
现在,即使“contactForm”可见,它也会每2秒刷新一次页面。
我的逻辑是:如果“contactForm”可见,延迟刷新或停止刷新,继续检查,但同时刷新页面相应的另一个语句。
LE。
$(function() {
refreshAjax = function(){$("#flex1").flexReload();
}
});
LE2。 提供最终的解决方案在这里由@Nick Craver
$(function () {
var ajaxTimeout;
function autorun() {
if ($("#contactForm").is(":visible")){
if(ajaxTimeout) {
clearInterval(ajaxTimeout);
ajaxTimeout = false;
}
}
else if(!ajaxTimeout) {
ajaxTimeout = setInterval(refreshAjax, 15000);
}
}
setInterval(autorun, 2000);
});
谢谢,克里斯蒂安。
目前你正在创建很多间隔计时器,这是不好的。 我不知道这是否可以解决您的问题,因为除此之外,您的代码看起来还不错。
试试看:
var ajaxTimeout;
function autorun() {
if ($("#contactForm").is(":visible")){
if(ajaxTimeout) {
clearInterval(ajaxTimeout);
ajaxTimeout = false;
}
}
else if(!ajaxTimeout) {
ajaxTimeout = setInterval(refreshAjax, 15000);
}
}
$(function() {
setInterval(autorun, 2000)
});
请记住,时间以毫秒为单位。
更新: @tec有另一个有趣的解决方案。 所以这取决于你实际想用代码实现的目标。
看起来你还没有完全理解setTimeout / setInterval是如何工作的。 您需要知道的第一件事是,这些方法总是异步工作。 Javascript代码永远不会停止并等待。 相反,首先你的方法(和调用堆栈)完成; 之后执行延迟的方法调用。 我建议在javascript中阅读“线程化”的一个很好的解释,如: http : //ejohn.org/blog/how-javascript-timers-work/
所以在你的代码中,autorun()每两秒调用一次。 每两秒评估一次if。 如果联系表格可见,则没有任何反应,因为我猜您不会等待15 Mio秒。 如果它不可见,则开始以15秒的间隔调用refreshAjax()。 但请记住:这是每两秒钟完成一次。 所以15秒后第一次调用refreshAjax()。 经过17秒再次和19,21之后,依此类推。 30秒后,它每两秒开始调用两次。
一个简单的解决方案是:
$(function autorun() {
if ($("#contactForm").is(":visible")){
// It's visible, so don't do anything.
// But check again in two seconds if it is still visible.
setTimeout( "autorun();", 2000 );
}
else {
// it's not visible, yay!
// Let's refresh and check again in 15 seconds
setTimeout( "autorun();", 15000 );
refreshAjax(); // note that refreshAjax is called instantly, _not_ after 15 seconds
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.