私のページ<table>
には、html ページでかなり大きなデータセット( ) をフェッチする ajax コードがあります。これを終えた後、私はこのテーブルで重い作業を行います ( datatablesで初期化する、行にクリックハンドラーを追加する、非表示の列を表示するなど) 魔女にはかなりの時間がかかります。
この初期化が行われている間、ページが動かなくなったように感じます。おそらく別のスレッドを使用して読み込み中の画像を表示し、計算が終了したらそれを閉じることはできますか?
SO に関する古い質問であるこのJavaScript とスレッドに出くわし、javascript のスレッドはすべての Web ブラウザーで完全にサポートされているわけではありません (つまり、gears プラグインが必要です)。
私がやりたいことをするのに役立つ新しいものはありますか?それはクロスブラウザですか? 多分いくつかのJQueryプラグインか、私が気付いていないものでしょうか?
更新 これはこれまでの私のコードです:
HTML:
<div id="ajDiv">
<div id="ajaxDiv1" class="ajaxDiv"></div>
<div id="tmpContainer" style="display:none;"></div>
</div>
JS:
function postForm(){
$.ajax({
type: 'POST',
url: 'ajax.jsp',
data: {
},
beforeSend:function(){
$('#ajaxDiv1').html('<div class="loading"><img src="../images/ajax_loader.gif" alt="Loading..." /></div>');
$('#ajaxDiv1').show();
$('#tmpContainer').hide();
},
success:function(data){
$('#tmpContainer').html(data);
//UNTILL HERE EVERYTHING WORKS FINE
//FROM NOW ON THE PAGE FREEZES UNTILL THE
//DATATABLES INITIALIZE FULLY
oTable = $('#example').dataTable({
"aaSorting": [[ 1, "asc" ]],
"bJQueryUI": "true" ,
"sPaginationType": "full_numbers",
"iDisplayLength": 100,
"aoColumns": [
null,null,null,null,null,null,null,null,null,
null,null,null,
{ "sType": "date-euro" },
null,null,
{ "sType": "date-euro" },
null,null
]
}).columnFilter();
/* Add a click handler to the rows */
$("#example tbody").on("click",function(event) {
$(oTable.fnSettings().aoData).each(function (){
$(this.nTr).removeClass('row_selected');
});
$(event.target.parentNode).addClass('row_selected');
});
$("#example").on("dblclick", "tr", function() {
var iPos = oTable.fnGetPosition( this );
var aData = oTable.fnGetData( iPos );
var iId = aData[1];
$('#edit'+iId).click(); //clicks a button on the first cell
});
//MORE CODE HERE ...................
$('#ajaxDiv1').hide();
$('#tmpContainer').show();
$('#example').css('width', '100%').dataTable().fnAdjustColumnSizing();
},
error:function(){
$('#ajaxDiv1').html('<p class="errorMsg"><strong>Oops!</strong> Try that again in a few moments.</p>');
}
});
}