2016-08-05 7 views
1

私のデータテーブルがロードされている間に表示する待機GIFを取得しようとしています。私は$(element).each()ループを入力する直前に$(element).show()と呼ぶだけで、すべての子グリッド(すなわち、DisplayInnerTable())をデータテーブルを使って表示します。待機中のGIFはJQueryを呼び出す直前に表示されません。

私は.each()メソッドに問題を絞り込んだようです。 .each()の中にあるすべてのコードを削除しても、待機中のGIFは表示されず、はい、私は.hide()も削除します。 .each()の直前にブレークポイントを置くと、待機中のGIFが表示されます。 .each()が非常に速く起こっているように、タイミング問題と思われるwait.gifの中にdivはレンダリングする時間がありません。そしてそのメモの中で、なぜJavascriptスレッドはhtml要素の操作を妨げますか?

私はいくつかの同様の記事を見つけましたが、どれもこの特定の問題に答えません。他の記事のほとんどはsetTimeout()を使用することをお勧めします。私は可能な限りあらゆる方法でそれを試みました、運はありません。どんな助け、ヒント、手がかりも高く評価されます。ここで

は私のコードスニペットです:

$(document).ready(function() 
    { 
    $('#expand-all').on('click', function() { 
     $("#loader-wait-ani").show(); 
     ExpandAllChildGrids(); 
    }); 

    function ExpandAllChildGrids() 
    { 
     var tr; 
     $('#result-table tbody tr').each(function (value, index) { 
      tr = $(this).closest('tr'); 
      var row = outerTable.row(tr); 
      userId = row.cell(tr, 1).data(); 

     DisplayInnerTable(userId, row, tr); 
     }); 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 
     $("#loader-wait-ani").hide(); 
    } 
}); 

は、ここに私のhtmlです:

<div style="width:100%; margin: 0 auto; text-align:center;"> 
     <div id="loader-wait-ani" class="modal" style="display: none; z-index: 300;"> 
      <img src="~/Images/waitbar.gif" alt="Pleae Wait..." width="250" height="20" /> 
     </div> 
    </div> 
+0

あなたが複数のIDを持っていますか=「ローダー-WAIT-アニ "? – RIanGillis

+0

'.show()'でコールバック関数を使ってみましたか? –

+0

同じコード実行ルーチンで読み込み用GIFを表示したり非表示にしたりします。間にレンダリングは行われません。それはなぜ表示されないのですか? 'DisplayInnerTable'関数は内部で何をしますか? 'DisplayInnerTable'内にいくつかの非同期コードがありますか? –

答えて

1

はこれを試してみてください。それはshow()にコールバックし、すべての要求に対してreponses sendedではされるまで、ブラウザをブロックする各ループでasync: falseを使用してDisplayInnerTable()

$(document).ready(function() 
    { 
    $('#expand-all').on('click', function() { 
     $("#loader-wait-ani").show("fast", function(){ 
      ExpandAllChildGrids(); 
     }); 
    }); 

    function ExpandAllChildGrids() 
    { 
     var tr; 
     callDisplayInner(hideLoader); 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 

    } 
}); 

function hideLoader(){ 
     $("#loader-wait-ani").hide(); 
} 

function callDisplayInner(hideLoader){ 
     $('#result-table tbody tr').each(function (value, index) { 
      tr = $(this).closest('tr'); 
      var row = outerTable.row(tr); 
      userId = row.cell(tr, 1).data(); 

     DisplayInnerTable(userId, row, tr); 
     }); 
     hideLoader(); 
} 
+0

これは、最初のリクエストが終了するとすぐにローダーgifを隠すことになります。したがって、1つのリクエストが他のリクエストよりもはるかに時間がかかる場合、これは最善の解決策ではありません。 –

+0

@ t.nieseええ、私は間違った機能を持っていました。私は何がうまくいくと思いますか? –

+1

リクエストが非同期ではないが、ブラウザウィンドウが完全にフリーズしていると仮定して、gifアニメーションを含むすべてのものを停止する必要がある場合は、おそらくこれが機能する可能性があります。とにかく、要求時間にローディングインジケータが必要な場合、同期要求は本当に悪い考えです。それに加えて、 'async:false'はjQuery 1.8以降では推奨されていないので、使用しないでください。 –

1

上のコールバックです。あなたのコードがオンクリックコールバックの終わりに達するまで、ブラウザはレンダリングを行いません。

この時点で、データを非同期に要求する必要があり、すべてのデータがロードされた後、ロード中のgifを非表示にする必要があります。私はjQueryのajaxメソッドを使用して、返されたDefereを使用してリクエストを追跡できると仮定します。

そのようないくつかのもの:ここで

function DisplayInnerTable(userId, row, tr, callback) { 
    //return the Defered object of the jQuery request 
    return $.ajax('/request/to/url'); 
} 


$(document).ready(function() { 
    $('#expand-all').on('click', function() { 
    $("#loader-wait-ani").show(); 
    ExpandAllChildGrids(); 
    }); 


    function ExpandAllChildGrids() { 
    var tr; 
    var allRequests = []; 
    $('#result-table tbody tr').each(function(value, index) { 
     tr = $(this).closest('tr'); 
     var row = outerTable.row(tr); 
     userId = row.cell(tr, 1).data(); 

     //collect all Deferes in an array 
     allRequests.push(DisplayInnerTable(userId, row, tr)); 
    }); 


    $.when.apply($, allRequests) 
     .then(function() { 
     // will be executed when all requests are finished 
     $('#expand-all-img').attr('src', '/Images/minus.gif'); 
     $("#loader-wait-ani").hide(); 
     }) 
    } 
}); 

いくつかの関連情報:

+0

あなたのソリューションは確かに正しい方法のようですが、残念なことにDatatablesを使って私が非同期の場合はグリッドがレンダリングされないように設計されています。私はasyncをtrueに設定し、待っているgifが表示されていることを確認しますが、グリッドがレンダーされません。 – Robert

関連する問題