【发布时间】:2012-01-27 12:27:13
【问题描述】:
我使用 Mustache 生成一些 HTML,并使用 insertAdjacentHTML 将其放置在页面上。它显然已转换为 DOM 结构,因为我之后可以使用 document.querySelector('.contentarea') 调用来处理它。但是,如果我尝试获取宽度或高度的像素值,它会不断返回 'auto'。
认为这可能只是 getComputedStyle 的问题,我尝试改用 .getBoundingClientRect 和 .offsetWidth。两者都返回0。如果我通过将调用放在setTimeout(function(){}, 1) 中稍微延迟调用,它会起作用,但这对于我的生产代码来说是不切实际的,因为它需要进入同步构造函数。
Firefox (Aurora) 和 Chrome 都会出现这种情况。 我记得读过一篇关于 Mozilla 如何通过使用惰性框架构造来提高 DOM 操作性能的文章,并认为可能存在框架有点太惰性的错误,但由于它也发生在 Chrome 中,所以似乎不太可能。
有人对这里发生的事情或如何解决它有任何想法吗?我真的需要在插入 HTML 后立即获得像素高度/宽度信息。
PS:是否有浏览器在单独的线程中执行 HTML 到 DOM 的解析/构建?我在想这也可能导致这种行为。
没关系:这是我自己的错。我只是没有注意到在代码尝试获取测量值之前设置的 display: none; 样式。
【问题讨论】:
-
你能发布一些相关的代码吗? HTML 是否是可见的并且会导致重新流动?要强制浏览器重新流动(并获得正确的宽度或高度),您应该能够使用以下任何一种:offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、 clientHeight 或 getComputedStyle()(IE 中的 currentStyle)。
-
你是对的。我搜索了前面的每一行代码,最后发现我在其中一个父元素上过早地设置了
display: none;。
标签: javascript css dom