私の質問は2つの部分です:
質問のパート1:
テスト a:
t1 = new Date().getTime();
for (i=0; i<205; i++) {
document.getElementById("divTest").innerHTML = sText;
}
t2 = new Date().getTime();
alert(t2-t1);
結果: 16ms
テストb;
document.getElementById("divTest").innerHTML = sText;
t1 = new Date().getTime();
for (i=0; i<205; i++) {
if ( document.getElementById("divTest").scrollHeight > document.getElementById("divTest").clientHeight ) {
j++;
}
}
t2 = new Date().getTime();
alert(t2-t1);
結果: 2ms
したがって、理論的には、両方をループ内に配置すると、約 18 ミリ秒になるはずですが、テスト c は私が間違っていることを証明しています。
テスト c:
t1 = new Date().getTime();
for (i=0; i<205; i++) {
document.getElementById("divTest").innerHTML = sText;
if ( document.getElementById("divTest").scrollHeight > document.getElementById("divTest").clientHeight ) {
j++;
}
}
t2 = new Date().getTime();
alert(t2-t1);
結果:240ms
驚異の240ms!!! 動作はブラウザ間で一貫しています。なぜこれが起こるのですか?
質問のパート2:
以来
document.getElementById("divTest").innerHTML = sText;
は一般的に遅いですが、ここでより高速な方法を見つけました: http://blog.stevenlevithan.com/archives/faster-than-innerhtmlしたがって、最終的な実装 ( test c ) は次のようになります。
t1 = new Date().getTime();
for (i=0; i<205; i++) {
el = document.getElementById("divTest").cloneNode(false);
el.innerHTML = sText;
document.getElementById("divTest").parentNode.replaceChild(el, document.getElementById("divTest"));
if (el.scrollHeight > el.clientHeight) {
j++;
}
}
t2 = new Date().getTime();
alert(t2-t1);
結果は 105ms で、240ms よりも優れています
しかし、parentnode またはその他の dom 操作方法を使用して、innerHTML を直接 DOM 操作に置き換えたように、scrollheight と clientheight にアクセスするより高速な方法を取得できるかどうか疑問に思っていました。
前もって感謝します!