Mam aplikację, która służy do analizy danych i mam kilka problemów z wydajnością podczas tworzenia tabeli. Dane są pobierane z dokumentów i ważne jest, aby wszystkie dane były prezentowane na jednej stronie (paginacja niestety nie jest opcją).Dynamiczne tworzenie dużych tabel html w wydajności javascript
Korzystając z jQuery, wysyłam żądanie ajax do serwera w celu pobrania danych. Po zakończeniu żądania przekazuję dane do funkcji wyjściowej. Funkcja wyjściowa przechodzi przez macierz danych za pomocą pętli for i konkatenacji wierszy do zmiennej. Po zakończeniu pętli zmienna zawierająca tabelę jest następnie dołączana do istniejącego elementu div na stronie, a następnie włączam zdarzenia do tabeli w celu pracy z danymi.
Z niewielkim zestawem danych (~ 1000-2000 wierszy) działa stosunkowo dobrze, ale niektóre zestawy danych zawierają ponad 10.000 wierszy, co powoduje awarię przeglądarki Firefox i jej zamknięcie lub przestaje odpowiadać.
Moje pytanie brzmi: czy istnieje lepszy sposób na osiągnięcie tego, co robię?
Oto niektóre kodu:
//This function gets called by the interface with an id to retrieve a document
function loadDocument(id){
$.ajax({
method: "get",
url: "ajax.php",
data: {action:'loadDocument',id: id},
dataType: 'json',
cache: true,
beforeSend: function(){
if($("#loading").dialog('isOpen') != true){
//Display the loading dialog
$("#loading").dialog({
modal: true
});
}//end if
},//end beforesend
success: function(result){
if(result.Error == undefined){
outputDocument(result, id);
}else{
<handle error code>
}//end if
if($('#loading').dialog('isOpen') == true){
//Close the loading dialog
$("#loading").dialog('close');
}//end if
}//end success
});//end ajax
};//end loadDocument();
//Output document to screen
function outputDocument(data, doc_id){
//Begin document output
var rows = '<table>';
rows += '<thead>';
rows += '<tr>';
rows += '<th>ID</th>';
rows += '<th>Status</th>';
rows += '<th>Name</th>';
rows += '<th>Actions</th>';
rows += '<th>Origin</th>';
rows += '</tr>';
rows += '</thead>';
rows += '<tbody>';
for(var i in data){
var recordId = data[i].id;
rows += '<tr id="' + recordId + '" class="' + data[i].status + '">';
rows += '<td width="1%" align="center">' + recordId + '</td>';
rows += '<td width="1%" align="center"><span class="status" rel="' + recordId + '"><strong>' + data[i].status + '</strong></span></td>';
rows += '<td width="70%"><span class="name">' + data[i].name + '</span></td>';
rows += '<td width="2%">';
rows += '<input type="button" class="failOne" rev="' + recordId + '" value="F">';
rows += '<input type="button" class="promoteOne" rev="' + recordId + '" value="P">';
rows += '</td>';
rows += '<td width="1%">' + data[i].origin + '</td>';
rows += '</tr>';
}//end for
rows += '</tbody>';
rows += '</table>';
$('#documentRows').html(rows);
Początkowo byłem przy użyciu jQuery każdej pętli, ale przełącza się do pętli który ogolił kilka ms.
Pomyślałem o użyciu czegoś w rodzaju narzędzi Google, aby spróbować odciążyć część przetwarzania (jeśli jest to możliwe w tym scenariuszu).
Jakieś myśli?
Pokaż pierwszą setkę, a następnie użyj zegarów lub robotników do zbudowania innych. Pamiętaj, że przeglądarka jest jednowątkowa. Podczas wykonywania js przeglądarka nie odpowiada. Użyj delegacji wydarzeń. – jasssonpet
Użyj wirtualnego przewijania http://nexts.github.io/Clusterize.js/ – Denis