【问题标题】:jQuery - Multiple setInterval ConflictjQuery - 多个 setInterval 冲突
【发布时间】:2011-06-23 02:25:43
【问题描述】:

我是一个 jQuery 新手,下面的每一个都可以单独工作,但是在一起工作时会浪费时间。我究竟做错了什么?对代码的任何改进也将不胜感激......它将用于轮播广告。

<!--- Header Rotator --->
<script type="text/javascript">
$(document).ready(function() {
    $("#header").load("header.cfm");
    var refreshHeader = setInterval(function() {
        $("#header").load("header.cfm");
    }, 10000);
});
</script>
<!--- Main Rotator --->
<script type="text/javascript">
$(document).ready(function() {
    $("#main").load("main.cfm");
    var refreshMain = setInterval(function() {
        $("#main").load("main.cfm");
    }, 5000);
});
</script>
<!--- Footer Rotator --->
<script type="text/javascript">
$(document).ready(function() {
    $("#footer").load("footer.cfm");
    var refreshFooter = setInterval(function() {
        $("#footer").load("footer.cfm");
    }, 2000);
});
</script>

【问题讨论】:

  • 它们以什么方式出现故障?如果只是在多个地方刷新内容,它们必须是准确的顺序吗?他们似乎有不同的时间?
  • 尝试通过在其中添加console.log() 进行调试,然后查看哪个出现故障,否则很难判断发生了什么,因为一切看起来都很好。另一方面,保持这样的轮询对服务器来说似乎很重,你不能检索大约 100 个广告然后在浏览器中本地切换它们吗?
  • @Oscar Godson 和@davin - 订单不是问题。时间是问题
  • @davin - 这在服务器上有多重?有什么需要担心的吗?内容根据客户端和不规则条件变化,无法缓存
  • @Chris,如果您添加 console.log(),您可能会看到导致时间偏离轨道的原因 - 从服务器加载可能需要时间,因此虽然代码运行良好,加载需要时间,这会导致延迟并使其看起来不定时。如果您可以按照我的第一个建议一次加载多个,那么这个问题就会得到解决,这样切换可以在本地进行并且更快。

标签: jquery conflict setinterval


【解决方案1】:

使用单个setInterval。你可以这样整理代码:

$(document).ready(function() {
     refreshCounter = 0;
     $("#header").load("header.cfm").data({refresh: 10});
     $("#main"  ).load("main.cfm"  ).data({refresh:  5});
     $("#footer").load("footer.cfm").data({refresh:  2});
     var refreshHeader = setInterval(function() {
         refreshCounter++;
         $("#header, #main, #footer").each(function(){
             var $this   = $(this);
             var refresh = $this.data('refresh');
             if ((refreshCounter % refresh) == 0) {
                 var cfmFile = this.id + '.cfm';
                 $this.load(cfmFile);
             }
         });
     },
     1000);
}); 

【讨论】:

  • 很好的解释!现在我也学到了一些新东西,;) 我很高兴我没有说其他任何事情,这比我想象的要干净!
  • 感谢您的夸奖。是你对单个计时器的想法让我开始思考如何在没有 Chris 使用的重复的情况下做到这一点。我这样做是为了阻止我的灰质萎缩!
  • @Neil - 谢谢你为我做这件事。这是非常赞赏。只有一个问题。除了显示每个部分的第一项内容之外,它不起作用
  • 克里斯,刚刚看到你的评论。它应该可以工作 - 给我几分钟,我会检查一下有什么问题。
  • 克里斯,我想我找到了问题所在。行“var refresh = $this.data(refresh);”应该是“var refresh = $this.data('refresh');”。即传递给“data()”的参数应该是一个字符串——mea culpa。我已经相应地编辑了上面的答案。
【解决方案2】:

如果您使用 jQuery 已经检查了这个插件 http://plugins.jquery.com/project/timers ,已知有多个 setintervterval 时间有时会出现一些问题。因此,如果您像 Isaac 建议的那样修复您的代码,但您发现它仍然无法正常工作,请尝试以下操作:我不会制作多个计时器,而是制作 1 个调度程序函数,它会在您的最低延迟(在本例中为 2000)触发,然后放置一个计数器每次递增 2000 并执行类似 if((counter % 2000) == 0){ action1code;} if((计数器 % 6000) == 0) { action2code} if((counter % 10000) == 0) { action3code}

希望这很清楚,我现在不是很尖锐:)

更新:好吧,如果没有您的代码或自己编写一大堆代码,我无法对此进行测试,但我相信这可能对您有用(尽管我今天的注意力非常低,所以我可能错过了一些明显的东西 ;D) .用这个替换你上面的所有代码:

 <script type="text/javascript">
 count = 10000; // this is so it will load everything the first time through.
 function timerFired () {
      if((count % 2000)==0){
           $("#footer").load("footer.cfm");
      }
      if ((count % 6000)==0) {
           $("#main").load("main.cfm");
      }
      if ((count % 10000)==0){
           $("#header").load("header.cfm");
           count =0;
      }
      count = count + 2000;
 }
 $(document).ready(function() {
     var refreshHeader = setInterval(timerFired(),2000);
  });
 </script>

附:如果直接从浏览器访问,请不要忘记清除您的浏览器缓存并确保您的 .cfm 正在按照您的预期进行更改。

【讨论】:

  • jQuery Timers 看起来很有希望,但它完全在我的脑海中,文档也很模糊。以后我可能会再看一次,当我感觉更敏锐时。我喜欢你关于单个函数的想法,但它也完全在我的脑海中
  • 好吧,我提到的艾萨克似乎已经删除了他的答案,但基本上首先你需要摆脱所有额外的文档准备功能。您的文档中只需要 1 $(document).ready。
  • 谢谢,但是,它不起作用。进一步...由于担心服务器过载(请参阅 davin cmets),我现在改变了策略并决定只坚持主要内容的刷新。非常感谢您对此的意见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多