2017-02-03 18 views
-2

私は様々なアイテムに関する情報を表示するweb-appを持っています。アイテムのわずかな部分だけが最初に表示されます。 (トップレベルのもの)。ページが最初にロードされたとき(そして最初のアイテムが表示されているとき)、私はAJAX経由でサーバーから完全なアイテムリストを要求しています。大きなHTMLチャンク(AJAX経由でロードされた)を追加するときにブラウザをフリーズする方法

リクエストが返されるとすぐに、アイテムを非表示divに挿入するので、ユーザーはアイテムを検索できます。 (完全なリストがロードされる前に検索を開始すると、モーダルダイアログで適切な「読み込み中のスピナー」が得られます)

私が唯一の問題は、ajaxで取り込んだデータを挿入した後、 (約10.000アイテム、生成されたHTMLの〜40MB)ブラウザは最大40秒間フリーズします。

私のコードは次のとおりです。

私はこの時の私のWebアプリが責任を作るために使用できる「パターン」
$.ajax({url: uri, data: { .... }}) 
     .done(function(data, status, jqXHR) { 
       data = $.trim(data); // takes about 35 ms 
       setupFullTree(data); 
     }) 

function setupFullTree (data,s){ 
    $tree.append('<div id="i-full-tree" data-status="loading" style="display:none"></div>'); // takes no measurable time 
    $('#i-full-tree').append(data); // takes between 10000 and 40000 ms, depending on the browser, ... 
    indexFts(); // takes about 50ms 
} 

?私はそれを小さな塊に分割しなければなりません(それは構造のような木ですので、これは簡単ではありません)。そして、私は挿入中にsetTimeoutを使う必要がありますか? WebWorkerで必要な計算の一部を移動する方法はありますか?

+2

...「フリーズ」は、追加しようとしている情報の量に起因する可能性があります。あなたはあまり追加しないと考えましたか? –

+0

理想的には、一度にDOM内のコンテンツを少なくしたいとします。ページングシステムのようなものを考えてみましょう。重要なことだけを示し、必要に応じてより多くのデータを読み込むことができます。 –

+0

その量のデータをAjaxなしでロードすると、永遠にかかるでしょう。ページング、プログレッシブロードなど – epascarello

答えて

1

ツリー構造で表示するajax応答データをjs変数に格納し、最初の100項目をロードして、ユーザーがデータの末尾までスクロールするとロードする必要があります。

+0

ユーザーは通常、10000要素をスクロールしません。彼は通常、何らかの情報を入力して項目を検索します。私がすでにDOMにデータを挿入していれば、単に一致する部品を見えるようにするだけです。私はjs-dataを検索し、マッチだけを追加することができたと思う。 –

+0

右。あなたはjsオブジェクト/配列を検索し、それらを追加します。より効率的にするために、ユーザーが一致しないように最小2〜3文字を入力する必要があります。別の方法は、文字列のどの部分にもマッチするのではなく、オブジェクト内の文字列の先頭を検索することです。 – Rajesh

+0

さて、私はそれを試してみましょう。 –

関連する問題