2011-12-25 3 views
7

私はいくつかのHTMLを生成するためにMustacheを使い、insertAdjacentHTMLを使ってそれをページに配置しました。それは後でdocument.querySelector('.contentarea')呼び出しを使用してそれに対処することができるので、明らかにDOM構造に変換されました。しかし、幅または高さのピクセル値を取得しようとすると、'auto'が返され続けます。getComputedStyleは、要素の作成直後にピクセル値に対して 'auto'を返すのはなぜですか?

getComputedStyleで問題が発生する可能性がありますので、代わりに.getBoundingClientRect.offsetWidthを試してみました。どちらも0です。 setTimeout(function(){}, 1)の中にコールを置くことでコールを少し遅らせると動作しますが、これは同期コンストラクタ内に入る必要があるため、私のプロダクションコードでは実用的ではありません。

これはFirefox(Aurora)とChromeの両方で発生しています。 私は、Mozillaが怠惰なフレーム構造を使用してDOM操作のパフォーマンスを改善する方法についての記事を読んで思い出したし、フレームは少しすぎ怠けているとバグがあるかもしれないと思ったが、それは同様Chromeで起こっているので、それは可能性が低いと思われます。

誰もがここで何が起こっているのかについての任意のアイデアを持っていますか、それを回避する方法? HTMLを挿入した直後のピクセルの高さ/幅の情報が本当に必要です。

PS:任意のブラウザでは、別のスレッドでDOM解析/建物にHTMLをしますか?私はこのような振る舞いを引き起こすかもしれないと考えていました。

NEVERMIND:それは私自身のせいでした。コードを測定しようとする前に設定されたdisplay: none;スタイルに気付かなかっただけです。

+1

関連するコードを投稿できますか?そして、HTMLが見えて、再フローが発生するでしょうか?ブラウザを強制的に再表示させるには、offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidthのいずれかを使用できるようにする必要があります。 clientHeight、またはgetComputedStyle()(IEのcurrentStyle)です。 – skyline3000

+0

あなたはそうです。先行するすべてのコード行を探し回り、最終的に親要素の1つに 'display:none; 'を早期に設定していたことがわかりました。 – download

答えて

8

「自動」の結果を引き起こす可能性のあることがいくつかあります。あなたはそれらの1つを見つけました。 display: none。要素がインラインの場合、autoも返されます。

本質的には、block又はinline-block要素でなければならず、それがレンダリングされなければなりません。

0

私の経験では、多くのブラウザ(IE、Chrome、Firefox)は、Javascriptスレッドが終了するか、タイムアウト呼び出しによってyieldされるまで意図的に計算レイアウトを遅らせます。

私が知っている解決策は、ブラウザに出力して再起動することだけです。 setTimeoutを使用する方法はうまくいきます。

+0

これは、ブラウズでは、DOM操作を1回実行するたびにページを再レイアウトする必要がないため、一連の一連の操作を行う場合には本当に無駄になる可能性があるからです。したがって、JSスレッドの実行が終了するまで待ってから、ページをレイアウトしてレンダリングします。これがどのように機能するかはブラウザによって異なります。 – jfriend00

+0

プログラムが 'getComputedStyle'や他のメソッドの1つを呼び出すことによって情報を要求すると、例外が発生すると私は考えていました。 – download

+0

@download:ブラウザに伝えれば、そのことを行い、DOMの変更/追加を(再)レイアウトするよう指示されます。 –

関連する問題