Javascript 除了setTimeout之外,还有其他方法强制浏览器重新绘制吗?

Javascript 除了setTimeout之外,还有其他方法强制浏览器重新绘制吗?,javascript,jquery,datatable,repaint,Javascript,Jquery,Datatable,Repaint,我正在使用(并参与)一个jQuery表排序插件,该插件包含一个事件,用于在对表进行排序之前进行额外处理。最初,浏览器在排序之前没有进行重新绘制,因此我向插件代码添加了一个setTimeout调用,该调用将强制重新绘制。现在代码是这样的: $table.trigger("beforetablesort", {column: th_index, direction: sort_dir}); setTimeout(function() { // do the hard work }, 10);

我正在使用(并参与)一个jQuery表排序插件,该插件包含一个事件,用于在对表进行排序之前进行额外处理。最初,浏览器在排序之前没有进行重新绘制,因此我向插件代码添加了一个setTimeout调用,该调用将强制重新绘制。现在代码是这样的:

$table.trigger("beforetablesort", {column: th_index, direction: sort_dir});

setTimeout(function() {
  // do the hard work
}, 10);
table.bind('beforetablesort', function (event, data) {
  $("table").css({opacity: 0.5});
});
我的
beforetablesort
回调如下:

$table.trigger("beforetablesort", {column: th_index, direction: sort_dir});

setTimeout(function() {
  // do the hard work
}, 10);
table.bind('beforetablesort', function (event, data) {
  $("table").css({opacity: 0.5});
});
以上各项都很好。但是,如果我使用
addClass
而不是内联样式,则在表格完全排序之前,不会显示来自该类的更改:

table.bind('beforetablesort', function (event, data) {
  $("table").addClass('disabled');
});
如果我将超时时间增加到500毫秒以上,则不透明度确实会改变。与内联样式更改相比,类更改看起来需要稍微长一点才能显示出来。但当浏览器准备重新绘制时,它已经在进行表排序了


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

也许您已经考虑过使用$.deferred()。
当延迟对象被解析时,超时中的代码应该进入回调处理程序

上述Jan Dvorak的注释有效


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


我刚刚添加了行
$table.css(“display”)和浏览器在排序开始之前重新绘制表。

您不是“强制”浏览器重新绘制,而是允许重新绘制。读取某些计算属性将等待回流。希望它也能确保重新绘制。也许你应该从降低插件的计算成本开始。似乎有很多东西可以单独运行得更快,只需要很小的更改。并不是说它能解决这个问题,但也许它会使它变得不那么重要。@thesystem我没有写它,但我一直在为它贡献力量。请随意发表自己的意见,或者在Github上发表一篇文章,建议一些“非常小的更改”,我们很乐意听到。我将把这些留给您,但大部分内容都围绕着不必要地使用jQuery,这总是会减慢速度。但仔细看一下代码,代码似乎使用了一个非常昂贵的
排序映射
,以便对列单元格数组进行排序,分析索引以创建表示新顺序的索引数组,然后将新顺序应用于行。为什么不创建一个行数组,使用适当的单元格索引对该数组进行排序,然后附加结果呢?还有其他代码问题,但我认为这似乎是最大的问题。这与
setTimeout
调用有什么不同?