私は、約300のDIVにHTMLデータを設定しているので、18秒かかるスクリプトがあります。以下のコード:JSONコールバックのHTMLデータを300以上のDIVに効率的に取り込む方法は?
HTML:
<div id="window">
<div id="wall">
<div class="module">
<div>
<div class="face front"></div>
<div class="face back"></div>
</div>
</div>
</div>
</div>
Javascriptを:私は2つの.html()
呼び出しをコメントアウトした場合
for (i = 0; i < numModules-1; ++ i)
{
var $mod = $('.module:eq(0)').clone();
modLeft += modSize;
if (modLeft + modSize > $('#wall').width())
{
modLeft = 0;
modTop += modSize;
}
$mod.css({
left: modLeft,
top: modTop
}).appendTo('#wall');
}
$.getJSON('html_server.php?callback=?', function(data) {
var htmlCount = data.length;
for (i = 0; i < numModules /* 300 or more */; ++ i)
{
var pick = Math.floor(Math.random() * Math.floor(htmlCount/2)) * 2;
var contentFront = data[pick];
var contentBack = data[pick+1];
var modStyle = '';
var $mod = $('.module:eq(' + i + ')');
var $modFront = $mod.find('.front');
var $modBack = $mod.find('.back');
// Set HTML content on front & back of module
$modFront.html(contentFront);
$modBack.html(contentBack);
}
});
、実行時間は約110msに低下するので、これらは明らかに犯人です。そして、HTMLコンテンツは最大で300バイトのデータではありません。
アドバイスはありますか?
EDIT:DIVを作成するコードを追加しました。おそらく、私はgetJSONコールバック内でそれを動かすことができ、HTMLが作成されたときにドロップすることができますか?助けてくれますか?
あなたのHTMLは見られますか?これを最適化する方法はたくさんありますが、すべてのdivを保持しているものを取り出し、デタッチし、javascriptオブジェクトとして編集してから、1つの.htmlをすべて実行した後に行うのが最適な方法です。あなたのhtml構造が分からないと書くことは難しいでしょう:) – Patricia
@CaptSaltyJack - > '.module'の中で' .front'と '.back'はどうですか?そうすれば、for..loopの中に.module string/arrayを構築し、それらをループ外の#wallにプッシュすることができます。 –
私は皆さんが提案していることは、最初にHTMLを構築してから、ワンショットで追加することだと思います。問題は、上のコードで分かるように、それぞれのCSSの位置を明示的に設定する必要があるため、 '$ mod.css()'を使うと便利です。 '
'のような生の文字列を作る以外に、これを行うには他にもいくつかの方法がありますか? – CaptSaltyJack