javascript - 有什么方法可以在 javascript 循环内强制重新绘制 DOM 元素吗?

标签 javascript

这是我试图解决的问题的简化示例。

我有一个 javascript 循环,在每次迭代中,我都会要求用户提供一些输入,然后希望在下一次迭代期间将其显示在浏览器中。目前,它将所有重绘操作保存到脚本末尾,然后在 block 中处理它们。有没有办法在循环进行时强制浏览器刷新/重绘?

这是代码。

<html>

  <head>
    <script>
      function mirror() {
        var userText = "Your text will go here";

        do {
          document.getElementById("target").innerHTML += userText + "<br>";
          userText = prompt("Enter your text, or click Cancel to finish");
        }
        while (userText !== null);
      }

    </script>
  </head>

  <body onload="mirror()">
    <p id="target"></p>
  </body>

</html>

浏览器重绘的正常建议是使用 window.setTimeout() 但这在循环内不起作用。

最佳答案

同步阻塞 while 是问题所在 - 直到当前 Javascript 停止运行并让浏览器处理其他内容(例如重画),才不会发生重画。

您可以在循环内添加轻微的异步延迟 - 设置 innerHTML 后,等待 50 毫秒再继续:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
async function mirror() {
  var userText = "Your text will go here";

  do {
    document.getElementById("target").innerHTML += userText + "<br>";
    await delay(50);
    userText = prompt("Enter your text, or click Cancel to finish");
  } while (userText !== null);
}
mirror();
<p id="target"></p>

也就是说,这有点像 X/Y 问题。最好完全避免 prompt - 它会阻止渲染(导致此类问题)并且对用户有些不友好。请考虑创建适当的模式输入,然后您可以创建所需的逻辑,而不会阻塞浏览器。

关于javascript - 有什么方法可以在 javascript 循环内强制重新绘制 DOM 元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60896839/

相关文章:

javascript - AngularJS 将变量传递给工厂

javascript - 如何解析或展平elasticsearch mongo River中的对象引用?

javascript - Dropzone 上传进度

javascript - 使用 Bootstrap 在 html 表中 float 文本和图标

c# - Breeze - 如何在保存更改调用之前处理同一 View 中两个实体的状态

javascript - 如何在覆盖后调用原始方法

javascript - 成功提交表单并在确认消息上单击“确定”后重定向到同一页面

javascript - .change() 仅运行一次,而不是在单击时运行

javascript - 在 React 中渲染嵌套导航

javascript - React Native 数组映射与多维数组