模拟JavaScript的setTimeout()方法“从第一原理”

时间:2018-05-12 05:25:58

标签: javascript firefox timeout

我正试图通过Firefox的setTimeout()在网站上运行Scratchpad。似乎有关于这种特殊JavaScript方法的各种Firefox错误 - 它是双胞胎,setInterval()。在Firefox v.56和最新的Waterfox(都是“Quantum”之前的版本)中,这些JavaScript方法似乎根本不起作用。相比之下,在Firefox“Quantum”版本中,它看起来确实有效......也就是说,完全相同的代码在FF“Quantum”中工作,它使立即工作 - “量子“Firefox的版本。是的,我已经尝试过all sorts of variations

有一种情况,我坚持使用Firefox的pre-Quantum版本进行本练习,我需要找到一种方法来从最初的原则“构建”这个setTimeout()方法,因为它是

一种想法是采用当前日期/时间,然后循环检查,看看是否已经过了10秒(或5分钟),然后再继续执行代码/脚本。

有关如何使用JavaScript有效地模拟setTimeout()资源的任何想法,但 没有 setTimeout()setInterval()

--- --- EDIT

虚假警报......也可以让setInterval()在旧浏览器中运行;我的坏!

(这意味着提出问题的原因已经消失,但问题可能仍然存在......)

---第二次编辑---

setTimeout()在这里工作:

setTimeout(function(){ alert("Hello"); }, 3000);

它不起作用/似乎在这里被忽略:

i=0;
while(i < 100)
{
 // window.open("https://www.cnn.com","_self");
 // window.open("https://www.bbc.com","_self");
   // setTimeout(function(){ alert("Hello"); }, 3000);
   setTimeout(function(){ window.open("https://www.bbc.com","_self") }, 3000);
  setTimeout(function(){ window.open("https://www.cnn.com","_self") }, 3000);
  alert(i);
  i++;
}
  // security mgr vetoed ???
  • 为什么?

2 个答案:

答案 0 :(得分:2)

如果您确实想要在不阻止浏览器的情况下模拟setTimeout函数等等,可以尝试使用requestAnimationFrame函数来获得一些延迟。它应该适用于Firefox 14.0+。这样的事情:

function mySetTimeout (callback, timeout) {
  var startTime = performance.now();

  function mySetTimeoutRec () {
    requestAnimationFrame(function () {
      // This way this function will be called
      // asynchronously around 60 times per second
      // (or less frequently on the inactive tabs).
      // We can check that enough time has passed
      // and call the user callback or this function again.
      var currentTime = performance.now();
      var elapsedTime = currentTime - startTime;

      if (elapsedTime < timeout) {
        mySetTimeoutRec();
      } else {
        callback();
      }
    });
  }

  mySetTimeoutRec();
}

它可以像setTimeout

一样使用
mySetTimeout(function () { console.log('Howdy.'); }, 10 * 1000);

无论如何,在大多数情况下,你不应该尝试做类似的事情。如果你似乎遇到了setTimeout的问题,可能还有其他问题。

答案 1 :(得分:1)

一种可能性是利用一个需要几秒钟的完整网络请求来完成:

&#13;
&#13;
<div class="parent">
  <div>HEADER</div>
  <div class="main">
    <div class="side">
      SIDE
    </div>  
    <main>
      MAIN
      <ul>
        <li>testing 1.. 2.. 3..</li>             
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
        <li>testing 1.. 2.. 3..</li>
      </ul>
    </main>
  </div>
  <div>FOOTER</div>
</div>
&#13;
&#13;
&#13;

但是,不要完全准确地依赖它的时间安排。