首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >除了setTimeout之外,还有什么方法可以强制浏览器重新绘制吗?

除了setTimeout之外,还有什么方法可以强制浏览器重新绘制吗?
EN

Stack Overflow用户
提问于 2013-02-24 02:09:48
回答 2查看 737关注 0票数 2

我正在使用(并参与)一个jQuery表排序插件,该插件包含一个在表排序之前进行额外处理的事件。最初,浏览器在排序前不进行重绘,所以我在插件代码中添加了一个setTimeout调用来强制重绘。所以代码现在是这样的:

代码语言:javascript
运行
复制
$table.trigger("beforetablesort", {column: th_index, direction: sort_dir});

setTimeout(function() {
  // do the hard work
}, 10);

我的beforetablesort回调是这样的:

代码语言:javascript
运行
复制
table.bind('beforetablesort', function (event, data) {
  $("table").css({opacity: 0.5});
});

上面这些都运行得很好。但是,如果我使用addClass而不是内联样式,那么该类的更改直到表完全排序后才会显示出来:

代码语言:javascript
运行
复制
table.bind('beforetablesort', function (event, data) {
  $("table").addClass('disabled');
});

如果我将超时时间增加到500ms以上,则不透明度会发生变化。与内联样式更改相比,类更改似乎需要更长一点的时间才能显示出来。但是当浏览器准备重新绘制时,它已经在对表进行排序了。

有没有办法提前强制重绘?或者等到表排序代码运行后再重新绘制?随意增加超时似乎不是一个好的解决方案,因为它会迫使所有表至少花费半秒的时间进行排序。(如果有帮助,插件的完整代码是here on Github。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-19 07:18:37

Jan Dvorak上面的评论起作用了。

读取某些计算属性将等待回流。希望它也能确保重新粉刷。

我只添加了行$table.css("display");,浏览器会在排序开始之前重新绘制表格。

票数 0
EN

Stack Overflow用户

发布于 2013-02-24 03:10:50

也许您已经考虑过使用$.deferred() http://api.jquery.com/jQuery.Deferred/。解析延迟对象时,超时中的代码应放入回调处理程序中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15043828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档