javascript 在运行过程中屏幕未更新,不会显示加载gif

idfiyjo8  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(90)

我试图显示一个加载的GIF,而算法运行约5秒。
我运行$('#loading-container')。show()在函数的开始(在算法运行之前)和$('#loading-container')。hide(),但什么都不显示。如果我在隐藏上设置了超时,那么一旦算法完成,我就可以看到gif正在运行。我还尝试了不同的方法来测试代码是否正在运行,例如替换具有相同问题的div上的文本,它只在算法运行后更新。
有谁知道为什么它没有展示出来吗?我想象所有的屏幕更改都在算法运行结束时被处理,gif立即被隐藏。

function mycode() {
    $('#loading-container').show()
    // do lots of code
    $('#loading-container').hide()
}

// this code will show the gif
function mycode() {
    $('#loading-container').show()
    // do lots of code
    setTimeout(function() {
        $('#loading-container').hide()
    }, 5000);
}

CSS

#loading-container {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background-color: rgba(0, 0, 0, 0.5);
            margin: 0;
            z-index: 9998;
        }

        .loading {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            z-index: 9999;
        }

        .loading img {
            display: block;
            margin: 0 auto;
            height: 100px;
        }

HTML

<div id="loading-container" style="display: none;">
        <div class="loading">
            <img src="assets/loading-buffering.gif" alt="Loading...">
        </div>
    </div>
ghhaqwfi

ghhaqwfi1#

这是因为浏览器在主线程中同步执行这些操作。你可以尝试使用requestAnimationFrame在一个绘制周期后运行你的同步代码:

function mycode() {
  $('#loading-container').show();
  requestAnimationFrame(() => {
    requestAnimationFrame(() => {
      // do lots of code
      $('#loading-container').hide();
    });
  });
}

(The我们需要调用两次而不是一次的原因是因为requestAnimationFrame在下一次重新绘制发生之前回调,所以我们需要确保loading-container有机会首先重新绘制。第二次调用确保第一次重新绘制已完成)

相关问题