#javascript
Есть input для ввода json-schema из которой потом генерируются формочки. Схема очень большая и при нажатии на кнопку "генерировать" происходит задержка. Причина задержки: отрисовка dom. Я пытаюсь добавить loader. Сама функция-обработчик кнопки "генерировать" - работает быстро, и когда я пытаюсь навесить стили, что бы показать и скрыть лоадер оно не срабатывает, т.к. оно очень быстро выполняется и пользователь просто не замечает этого. Вопрос: есть ли какой-нибудь способ отследить событие конца отрисовки dom? Это обработчик нажатия на кнопку: $('#loader').addClass('active-loader'); try { schema = JSON.parse($schema.value); } catch (e) { alert('Invalid Schema: ' + e.message); return; } // Вызывается метод, который перерисовывает DOM из json-schema // json-schema большая. 1.5к строк reload(); // Проблема в том, что эта строка отрабатывает быстрее чем перестроится dom // Это происходит мгновенно. $('#loader').removeClass('active-loader'); Проблема в том, что reload() отрабатывает быстро и loader сразу ныкается. Но dom еще перерисовывается, хотя функции уже отработали
Ответы
Ответ 1
Что, если рендерить не в DOM, а в переменную, и всё это время показывать «загружается..». А вставка уже отрендеренного html формы в родительский элемент, должно быть, гораздо быстрее, чем живой рендер по одному элементу в DOM напрямую? P.s. Сомневаюсь, что именно отрисовка занимает какое-то заметное время. Но даже если так – может, просто подобрать «на глаз» и наивно ставить setTimeout()? P.p.s. Есть события, вне стандартов, специфичные для бразуеров, которые используются в девелоперских тулзах для оценки эффективности рендеринга страниц, в основном. Но вы можете попробовать использовать их у себя. Напр. для Mozilla это событие MozAfterPaint – когда окончилась именно очередная отрисовка.Ответ 2
Сложно дать правильный ответ, не зная что делает Ваша функция reload, но, как вариант, в эту самую функцию можно передать callback, закрывающий loader, либо же поместить логику loader'а в саму функцию reload. Если же в этой функции используется location.reload, то прочтите ответы на следующий вопрос. Надеюсь, мой ответ поможет Вам разобраться с проблемой. Удачи!
Комментариев нет:
Отправить комментарий