Есть ли какие-то надежды на успешное отображение в браузере?
Я хочу вставить html асинхронно на страницу, а затем выполнить некоторые javascript-коды, связанные с вставленным DOM.
Подобные попытки всегда терпят неудачу, потому что рендеринг DOM в браузере занимает гораздо больше времени, чем выполнение следующих javascript-кодов.
Я встречался с такой проблемой раньше и задал вопрос, но никто не ответил. Это здесь: https://stackru.com/questions/31935005/whats-going-on-with-dom-after-orientationchange-event
Итак, могу ли я получить обещание или добавить функцию обратного вызова?
Коды здесь:
var bubble = function bubble(type,content){
var myScroll, temp = document.createElement('div');
temp.innerHTML=content;
temp.className=type==='time'?'time':'bubble '+type;
document.getElementsByClassName('dialogue')[0].appendChild(temp);
if(type==='reply')myScroll = new IScroll('.dlg-wrapper', { mouseWheel: true });
};
2 ответа
Насколько я знаю, такого события нельзя было бы послушать. Но вы можете сделать что-то, что обычно используется для анимации. Чтобы анимации работали плавно и с высокой скоростью, необходимо пакетировать весь доступ DOM, поскольку FastDom.js пытается абстрагироваться.
В общем, оружие выбора должно быть requestAnimationFrame()
чтобы ваш DOM имел доступ к фрейму, где браузер обновил DOM.
В твоем случае, new IScroll(...)
нужно учиться до querySelector('.dlg-wrapper')
на самом деле возвращает нужный элемент.
Я не думаю, что рендеринг является асинхронным, но он запускается сообщением, которое обрабатывается только после завершения сценария.
Но вы сказали "а затем выполните некоторые коды JavaScript, связанные с вставленным DOM"., Я не вижу, что происходит в вашем коде.
Во всяком случае, если вы используете setTimeout(callback, 0)
Вы можете сделать постобработку в обратном вызове. setTimeout
также управляется этой очередью сообщений, поэтому после завершения кода, который изменил DOM, браузер сначала обработает сообщение перерисовки (поскольку оно сначала находится в очереди сообщений), и только затем вызывает обратный вызов.