如何在浏览器中短暂地一致显示值

时间:2019-01-07 05:02:23

标签: javascript performance

我正在尝试创建一个探索潜意识边界的测试。我想简单地显示一个数字,看看用户是否可以凭直觉来猜测数值-他们的潜意识能够比其有意识的自我更快地阅读数字。因此,我尝试将数字闪烁到屏幕上几毫秒。 Chrome在此代码中的表现似乎不如Edge。如何使它在浏览器中更一致地工作?

我尝试了各种隐藏和显示数字的方法。最终以这个版本结束。

<script>

function onLoad() {
    numberOfPoints = Math.floor(Math.random() * (99 - 9 + 1)) + 9;
    document.f.points.value = numberOfPoints;
    setTimeout(hideRun, 3000);
}

function hideRun() {
    hide();
    document.getElementById("hiddenNumber").innerHTML = numberOfPoints;
    document.getElementById("hiddenNumber").style.display = 'block';
    setTimeout(hide, 5);
}

function hide() {
    document.getElementById("hiddenNumber").style.display = 'none';
}

</script>

<body onload="onLoad()">
    <div id=hiddenNumber style="display: block;">GET READY</div>
</body>

在这种情况下,我希望显示“准备就绪”文本3秒钟,然后显示5毫秒的随机数。尽管我无法真正测量它,但是chrome浏览器上的5毫秒要比Edge浏览器长5毫秒。

您可以在这里自己尝试:Test Timer

2 个答案:

答案 0 :(得分:2)

在时间上进行思考是不可靠的,因为您不知道浏览器何时绘制到屏幕上,也不知道屏幕何时进行垂直同步。
因此,您最好从框架的角度考虑它。

幸运的是,我们可以使用requestAnimationFrame方法将回调函数链接到paint-paint事件。

let id = 0;
btn.onclick = e => {
  cancelAnimationFrame(id); // stop potential previous long running
  let i = 0,
    max = inp.value;
  id = requestAnimationFrame(loop);
  
  function loop(t) {
    // only at first frame
    if(!i) out.textContent = 'some dummy text';
    // until we reached the required number of frames
    if(++i <= max) {
      id= requestAnimationFrame(loop);
    }
    else {
      out.textContent = '';
    }
  }
};
Number of frames: <input type="number" min="1" max="30" id="inp" value="1"><button id="btn">flash</button>
<div id="out"></div>

答案 1 :(得分:0)

您可以尝试使用2D画布,看看是否有帮助?

<html>
<head>
<script>
var numberOfPoints;

var canvas;
var context;

function onLoad() {
  canvas = document.getElementById("myCanvas");
  context = canvas.getContext("2d");
  context.font = "30px Arial";
  // context.fillText("...", 10, 50);
  numberOfPoints = Math.floor(Math.random() * (99 - 9 + 1) ) + 9;
  setTimeout(hideRun, 3000);
}
function hideRun() {
  context.fillText(numberOfPoints, 10, 50);
  setTimeout(hide, 5);
}
function hide() {
  context.clearRect(0, 0, canvas.width, canvas.height);
}
</script>
</head>
<body onload="onLoad()">
<canvas id="myCanvas"></canvas>
</body>
</html>

在我的测试中,它似乎比CSS属性更一致地显示了该数字,但是绝对可以肯定,我建议使用60fps的屏幕阅读器来记录和验证跨浏览器的准确性。