【问题标题】:Can I force the browser to render out the DOM changes before continuing javascript execution?我可以强制浏览器在继续执行 javascript 之前渲染出 DOM 更改吗?
【发布时间】:2012-11-12 06:59:57
【问题描述】:

我正在填充一个包含大约 500 行的表,这需要浏览器几秒钟的时间来呈现,而它看起来是冻结的。这就是为什么我要显示一条请求用户耐心的消息:

$.ajax({
  url: '{{ search_url }}',
  success: function (response) {
    $('#progress').text('Rendering results, please wait...');
    clear_table();
    populate_table(response);
  }
});

消息未显示 - 显然浏览器(在 Chrome 23 中测试)缓冲了所有 DOM 更改并一次性渲染它们。

作为一种解决方法,我发现当我延迟填充表格直到执行返回到事件循环时,实际显示的消息:

$.ajax({
  url: '{{ search_url }}',
  success: function (response) {
    $('#progress').text('Rendering results, please wait...');
    window.setTimeout(function () {
      clear_table();
      populate_table(response);
    }, 0);
  }
});

我想知道这种方法是否总是有效,或者这种情况下是否有更好的技术。

【问题讨论】:

  • 消息应该在ajax调用开始之前触发,而不是在成功回调中
  • 是的,您的 setTimeout 将是合适的解决方案,并且它始终有效。
  • ...也许还可以提高populate_table 的性能。 500 行并不算多,因此处理起来似乎不会花费太长时间。
  • 是的,我也觉得有点奇怪。嗯,它是 jQuery 并且涉及列宽调整,但我会看看我是否可以组合一个独立的测试用例。

标签: javascript jquery google-chrome browser


【解决方案1】:

这是因为 Javascript 执行是单线程的。因此,在执行所有 JS 代码之前,浏览器不会做任何事情——换句话说,它会冻结。为了防止这种情况发生,我建议您使用jQuery Async plugin(只是几行代码),它会定期将控制权交还给浏览器(通过使用setTimeout)。这可以防止浏览器冻结,并且会毫无问题地显示等待消息。

【讨论】:

  • 很好,因为填充已经是一个 $.each,它是 20 个字符的变化。它使用与我的解决方法相同的技术。
  • 已经有一段时间了......但是因为我遇到了类似的问题(Chrome 83 在我的扩展程序中的 $.each 循环期间没有更新按钮的文本/html)我想知道:为什么它可以在 Firefox 中使用吗?在哪里可以详细了解所有浏览器之间的渲染策略差异?
猜你喜欢
  • 2021-09-15
  • 2015-04-26
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多