繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM