0

我想在页面中异步插入一些html,然后执行一些与插入的DOM相关的javascript代码。

这种努力总是失败,因为在浏览器中渲染 DOM 比执行下一个 javascript 代码需要更多的时间。

我以前遇到过这样的问题并提出了一个问题,但没有人回答。它在这里:https ://stackoverflow.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 });
};
4

2 回答 2

1

据我所知,没有这样的事件可以听。但是你可以做一些通常用于动画的事情。为了保持动画以高速率平稳运行,需要批处理所有 DOM 访问,因为FastDom.js试图抽象掉。

总而言之,选择的武器应该是requestAnimationFrame()将您的 DOM 访问调度到一个 Frame,浏览器已在其中更新了 DOM。

在您的情况下,new IScroll(...)需要 schuedled 直到querySelector('.dlg-wrapper')实际返回所需的元素。

于 2015-11-28T10:44:38.270 回答
0

我不认为渲染是异步的,而是由仅在脚本结束后才处理的消息触发的。

但是您说“然后执行一些与插入的 DOM 相关的 javascript 代码”。. 我没有在您的代码中看到这种情况。

无论如何,如果您使用,setTimeout(callback, 0)您可以在回调中进行后处理。setTimeout也是由那个消息队列控制的,所以修改DOM的代码完成后,浏览器会首先处理重绘消息(因为它在消息队列中是第一个),然后才调用回调。

于 2015-11-28T09:55:02.063 回答