javascript检查元素是否可见并相应地设置“setInterval”

LE2。 关于如何解决这个问题的任何其他想法?

我有这个代码,无法解释为什么不能正常工作:

$(function autorun() { if ($("#contactForm").is(":visible")){ setInterval( "refreshAjax();", 150000000000 ); } else { setInterval( "refreshAjax();", 15000 ); } setTimeout("autorun();", 2000) }); 

  

现在它每2秒刷新一次页面,即使“contactForm”可见。

我的逻辑是:如果“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 } });