Javascript 是一个元素';将其添加到DOM树后,是否立即读取其维度?

Javascript 是一个元素';将其添加到DOM树后,是否立即读取其维度?,javascript,dom,dimensions,reflow,Javascript,Dom,Dimensions,Reflow,假设我使用document.createElement动态创建一个DIV,添加一些内部文本,并希望确定其高度和宽度。我可以看到,在将DIV添加到DOM树之前,诸如offsetWidth和offsetHeight之类的属性是0,这是预期的。一旦以编程方式将其添加到树中,我是否可以期望这些属性立即“就绪”,或者是否存在重新绘制/回流可能会延迟并在稍后发生的环境 textDiv = document.createElement("div"); textDiv.innerHTML = "some dyn

假设我使用
document.createElement
动态创建一个DIV,添加一些内部文本,并希望确定其高度和宽度。我可以看到,在将DIV添加到DOM树之前,诸如
offsetWidth
offsetHeight
之类的属性是0,这是预期的。一旦以编程方式将其添加到树中,我是否可以期望这些属性立即“就绪”,或者是否存在重新绘制/回流可能会延迟并在稍后发生的环境

textDiv = document.createElement("div");
textDiv.innerHTML = "some dynamically created string";
console.log(textDiv.offsetWidth); // 0
document.body.appendChild(textDiv);
console.log(textDiv.offsetWidth); // OK?
我认为答案应该是“JavaScript解释器是单线程的,appendChild触发的重绘/回流事件是该线程的一部分,并在继续下一条语句之前完成”。。。但是有人能检查我的理解吗


这有很多我想要的东西,但不清楚它有多具体。在任何情况下,应用程序开发人员似乎都可以假设在进行测量时,如通过访问offsetWidth,任何所需的重新喷漆/回流都会正确发生。

据我所知,只有在所有javascript函数或属性都作用于DOM树中已有的元素之后,才可以将它们添加到DOM树中

我尝试了这两种情况,结果证明以下方法效果良好:

<SCRIPT>
window.onload = function() {
textDiv = document.createElement("div");
textDiv.innerHTML = "some dynamically created string";
alert(textDiv.offsetWidth); // 0
document.body.appendChild(textDiv);
alert(textDiv.offsetWidth); // OK?
};

window.onload=函数(){
textDiv=document.createElement(“div”);
textDiv.innerHTML=“一些动态创建的字符串”;
警报(textDiv.offsetWidth);//0
document.body.appendChild(textDiv);
警报(textDiv.offsetWidth);//确定吗?
};

一旦您的元素添加到DOM中,它就应该可以访问,就像它从一开始就存在一样。简单的DOM操作是同步的


开始引入超时、间隔和Ajax时要小心。

这些警报本身可能会影响渲染。使用
console.log
和Firebug进行尝试。我的问题更多的是,在我进行offsetWidth时,是否完成了更改维度的重新绘制/回流。不管怎样,似乎可以安全地假设情况是这样;重新绘制/回流可以被视为JavaScript执行的同一线程的一部分。我会接受的。