除了setTimeout以外的任何方式强制浏览器重绘?

时间:2013-02-23 18:09:48

标签: javascript jquery datatable repaint

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

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

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

我的beforetablesort回调是这样的:

table.bind('beforetablesort', function (event, data) {
  $("table").css({opacity: 0.5});
});

以上一切正常。但是,如果我使用addClass而不是内联样式,则在表完全排序之前,不会显示该类的更改:

table.bind('beforetablesort', function (event, data) {
  $("table").addClass('disabled');
});

如果我将超时时间增加到500毫秒以上,则不透明度会发生变化。似乎需要更长的时间才能看到类更改,而不是内联样式更改。但是当浏览器准备好重新绘制时,它已经在进行表格排序。

有没有办法早点强制重拍?或者等到重新绘制表格排序代码才能运行?任意增加超时似乎不是一个好的解决方案,因为它强制所有表至少需要半秒才能排序。 (如果有帮助,插件的完整代码为here on Github。)

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

Jan Dvorak的评论高于作品。

  

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

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