我正在使用(并参与)一个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。)
答案 0 :(得分:0)
也许您已经考虑过使用$ .deferred()http://api.jquery.com/jQuery.Deferred/。 当延迟对象被解析时,超时中的代码应该放在回调处理程序中
答案 1 :(得分:0)
Jan Dvorak的评论高于作品。
读取一些计算属性将等待重排。希望它也能确保重新粉刷。
我刚刚添加了行$table.css("display");
,浏览器在排序开始之前重新绘制了表格。