【问题标题】:one second intervals in loop result循环结果中的一秒间隔
【发布时间】:2013-08-28 15:29:01
【问题描述】:

我尝试创建一个循环(有条件),但我不想立即看到结果。我想查看每行以一秒间隔显示的结果。

第 1 行 = 第 1 行,第 2 行 = 第 2 行(第 1 行仍然可见),第 3 行 = 第 3 行(第 1 行,第 2 行仍然存在,依此类推..)

首先,PHP 脚本应该循环(30 行,因为条件需要 $i

循环示例:

  for ($i=1; $i<=30; $i++) {
   $roll = mt_rand(1,3);     
    if ($roll=="1") {echo "1 <br />\n";}
elseif ($roll=="2") {echo "2 <br />\n";}
  else {echo "3 <br />\n"; }

我试图找到一些非常简单和功能强大的东西,没有 jQuery,没有毫无意义的长代码,而是简单的短脚本。我的JS水平真的很低,所以想请教各位大神。你能帮帮我吗?

【问题讨论】:

  • 您需要将所有数据发送到客户端或使用Ajax。无论哪种情况,请查看 setTimeout 或 setInterval
  • 您可以使用flush(); 强制发送数据,但如果您使用输出缓冲或gzip 压缩,这并不总是有效。
  • 我需要一些始终有效的东西..

标签: php javascript loops for-loop intervals


【解决方案1】:

好吧,setTimeOut() 的问题是,当第一个 oneNumber() 函数执行时,循环已经结束,并且 y=31。我认为当你调用 setTimeOut() 函数时会有一种方法来修复变量值,但我还没有找到它。 这是我发现的唯一方法:

<!DOCTYPE html>
    <body>
    <?php
    for ($i=1; $i<=30; $i++) {
         $roll = mt_rand(1,3);
            if ($roll==1) {echo '<b id="b'.$i.'" style="display: none;"> 1</b>';}
        elseif ($roll==2) {echo '<b id="b'.$i.'" style="display: none;"> 2</b>';}
          else {echo '<b id="b'.$i.'" style="display: none;"> 3</b>';}
                             }
    ?>
    <script>
    window.onload = function () { 

    window.setTimeout(function() {
    document.getElementById('b1').style.display="block";
    },1000)
    window.setTimeout(function() {
    document.getElementById('b2').style.display="block";
    },2000)
    window.setTimeout(function() {
    document.getElementById('b3').style.display="block";
    },3000)
    window.setTimeout(function() {
    document.getElementById('b4').style.display="block";
    },4000)
    window.setTimeout(function() {
    document.getElementById('b5').style.display="block";
    },5000)
    window.setTimeout(function() {
    document.getElementById('b6').style.display="block";
    },6000)
    window.setTimeout(function() {
    document.getElementById('b7').style.display="block";
    },7000)
    window.setTimeout(function() {
    document.getElementById('b8').style.display="block";
    },8000)
    window.setTimeout(function() {
    document.getElementById('b9').style.display="block";
    },9000)
    window.setTimeout(function() {
    document.getElementById('b10').style.display="block";
    },10000)
    window.setTimeout(function() {
    document.getElementById('b11').style.display="block";
    },11000)
    window.setTimeout(function() {
    document.getElementById('b12').style.display="block";
    },12000)
    window.setTimeout(function() {
    document.getElementById('b13').style.display="block";
    },13000)
    window.setTimeout(function() {
    document.getElementById('b14').style.display="block";
    },14000)
    window.setTimeout(function() {
    document.getElementById('b15').style.display="block";
    },15000)
    window.setTimeout(function() {
    document.getElementById('b16').style.display="block";
    },16000)
    window.setTimeout(function() {
    document.getElementById('b17').style.display="block";
    },17000)
    window.setTimeout(function() {
    document.getElementById('b18').style.display="block";
    },18000)
    window.setTimeout(function() {
    document.getElementById('b19').style.display="block";
    },19000)
    window.setTimeout(function() {
    document.getElementById('b20').style.display="block";
    },20000)
    window.setTimeout(function() {
    document.getElementById('b21').style.display="block";
    },21000)
    window.setTimeout(function() {
    document.getElementById('b22').style.display="block";
    },22000)
    window.setTimeout(function() {
    document.getElementById('b23').style.display="block";
    },23000)
    window.setTimeout(function() {
    document.getElementById('b24').style.display="block";
    },24000)
    window.setTimeout(function() {
    document.getElementById('b25').style.display="block";
    },25000)
    window.setTimeout(function() {
    document.getElementById('b26').style.display="block";
    },26000)
    window.setTimeout(function() {
    document.getElementById('b27').style.display="block";
    },27000)
    window.setTimeout(function() {
    document.getElementById('b28').style.display="block";
    },28000)
    window.setTimeout(function() {
    document.getElementById('b29').style.display="block";
    },29000)
    window.setTimeout(function() {
    document.getElementById('b30').style.display="block";
    },30000)
    }   

    </script>
    </body>
    </html>

【讨论】:

  • 哇,这真的有效,它有点复杂,但有效.. 我玩这个,也许我会找到更简单的东西。谢了。
【解决方案2】:

您在寻找sleep() 功能吗?在执行下一条语句之前需要几秒钟的等待。也改变了你的 1-2-3 逻辑,条件似乎没有必要。

for ($i=1; $i<=30; $i++) {
   $roll = mt_rand(1,3);
   sleep(1);
   echo $roll." <br />";
}

【讨论】:

  • 循环只是示例,所以不要理会逻辑.. sleep() 在页面重新加载之前会延迟很长时间.. 所以不,这不是我要找的功能..我需要每 1 秒显示 1 行,共 30 行..
  • 实际上,sleep() 是我正在寻找的函数,谢谢。
【解决方案3】:

您可以在每行之后暂停 PHP 一秒钟,并在每次唤醒时刷新输出缓冲区:

for ($i=1; $i<=30; $i++) {
    $roll = mt_rand(1,3);     
    if ($roll == "1")
        echo "1 <br />\n";
    else if ($roll == "2")
        echo "2 <br />\n";
    else
        echo "3 <br />\n";

    // Flush the output buffer
    ob_flush();
    // Sleep for one second
    sleep(1);
}

需要调用ob_flush(),因为PHP缓冲输出,所以简单的休眠会延迟页面输出,但它仍然会立即出现在浏览器中。

当您这样做时,请注意您的脚本执行时间可能比 PHP 允许的最大执行时间长。 您可以在代码中设置此限制:

set_time_limit(90); // Maximum execution time is 90 seconds
set_time_limit(0);  // No execution time limit

或在您的 php.ini 文件中:

max_execution_time = 90

【讨论】:

  • 不,重新加载页面的时间很长。我需要每 1 秒显示 1 行,共 30 行。
  • 调用 ob_flush() 会将每一行发送到浏览器,即使页面没有完成加载,即使你的页面需要很长时间才能加载。
  • 是的,我尝试了错误 -> 致命错误:超过 30 秒的最大执行时间,我不想等待结果然后立即查看,我希望每 1 秒查看一次另一行总共 30 行。所以,30 秒后,将显示 30 行。
  • 这对我来说很好,并且与您的建议类似 -> stackoverflow.com/questions/15036232/…
【解决方案4】:

【讨论】:

  • 始终使用真实且最新的参考资料。 developer.mozilla.org/en/docs/Web/API/window.setTimeout
  • 我会尝试让循环中的每一行都有一个 ID 并设置 display: none;然后是 JS,类似的东西(但没有运气):
  • 在 setTimeout() 函数中保留引号。
  • 试试这个:
  • 什么也没发生。我正在用这个 PHP 代码尝试你的脚本 -> 1\n";} elseif ($roll==" 2") {echo "\n";} else {echo "\n";} } ?>
猜你喜欢
  • 1970-01-01
  • 2020-03-25
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多