2013-02-23 2 views
2

Я использую (и способствую) плагин сортировки таблицы jQuery, который включает событие для дополнительной обработки до сортировки таблицы. Первоначально браузер не делал перерисовку перед сортировкой, поэтому я добавил вызов setTimeout коду плагина, который должен принудительно перерисовать. Таким образом, код теперь так:В любом случае, кроме 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

Вы не «заставляете» перерисовать браузер так же, как _allowing_ a repaint. –

+0

Чтение некоторого вычислимого свойства будет ждать возврата. Надеюсь, он также обеспечит перерисовку. –

+0

Возможно, вам стоит начать с того, чтобы сделать ваш плагин менее дорогостоящим. Кажется, что есть много вещей, которые будут выполняться индивидуально намного быстрее с очень небольшими изменениями. Не то, чтобы это решило эту проблему, но, возможно, это сделает ее менее актуальной. –

ответ

0

Комментарий от Джона Дворжака над работами.

Чтение некоторых вычислимых объектов будет ждать перепланировки. Надеюсь, он также обеспечит перерисовку.

Я только что добавил строку $table.css("display");, и браузер перекроет таблицу перед началом сортировки.

0

Возможно, вы уже рассмотрели использование $ .deferred() http://api.jquery.com/jQuery.Deferred/. Код в тайм-ауте должен идти в обработчике обратного вызова при отложенном объекте

+0

Что это значит по-разному с вызовом 'setTimeout'? – DisgruntledGoat

Смежные вопросы