AJAX-Updater nicht performant

ahykes

Erfahrenes Mitglied
Guten Morgen!
Ich habe ein Problem mit meiner Webseite, dass ich mir zwar erklären aber nicht beheben kann :-(
Fangen wir mal an:

Ich hole aus der Datenbank eine Liste, die ich über PHP in Form einer HMTL-Tabelle darstelle. Die Tabelle hat ca. 200 Zeilen. Jede Tabellenzeile sieht so aus:

HTML:
<tr id="0701801" title="0701801" bgcolor="#aac6f5"   >
	<td align="center" bgcolor="#FFFFFF" width="15" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);"><a name="0701801.scrollPosition" ><img src="http://www.tutorials.de/images/logo_mb.gif" id="0701801.LOGO" onDblClick="deSelectTableRow();";></a></td>
	<td id="0701801.BMIMG" align="center" bgcolor="#FFFFFF" width="30" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);"><img src="http://www.tutorials.de/images/bmImg/A2LL35.jpg" title="A2 / LL / 3.5 to"></td>
	<td id="0701801.PNR" align="center" width="48" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);">0701801</td>
	<td id="0701801.SAT" align="center" width="48" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);">02.11.10</td>
	<td id="0701801.SPERRSTATUS" align="center"  width="50" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);"><b></b></td>
	<td align="center" align="center"><img src="http://www.tutorials.de/images/edited_state.gif" onClick="expandDistrictionDialog('0701801');" style="cursor: pointer;"></td>
	<td id="0701801.EVENT" align="center" width="41" onClick="javascript: addPnr2Hist('0701801','images/logo_mb.gif'); selectTableRow('0701801',false);">FP660</td>
	
	<input type="hidden" id="0701801.LISTE" value="1">
	<input type="hidden" id="0701801.SPERRSTATUS_DATA" value="">
	<input type="hidden" id="0701801.POS" value="46712">
<script language="Javascript">ksbProducts.push("0701801");</script></tr>

Ihr ahnt worauf es hinausläuft? Nun soll die Tabelle zyklisch über AJAX aktualisiert werden. Das funktioniert auch einwandfrei. Nun reden wir an dieser Stelle leider vom IE6! Den muss ich leider nehmen.

Endlich kommt das Problem: Jedes Mal, wenn Updater durch die Seite läuft, "hängt" quasi der komplette Browser. Mir scheint, dass ich den Browser damit total überfordere. Habe ich vielleicht die falsche Art und Weise gewählt um die Tabelle zu aktualisieren?
So sieht der Updater aus:

Code:
function dynamicUpdater(dataStream){

	//vars
	var rsSeperator = '[+]';
	var fieldSeperator = '|';
	var ksb = new Array();
		
	//Datenstrom auseinander nehmen
	//0686180 | 0686180 | 5 | 99285 | 0 | 22.09.10 | 90665713 | | FP630 | logo_mb.gif | images/bmImg/A4LL50.jpg | A4 / LL / 5.0 to | AR5 BB3 ... [+]
	
	if(dataStream != currentProductsString){
	
		
		var ksb 	= dataStream.split(rsSeperator);
		ksbOld 		= currentProductsString.split(rsSeperator);
		
		var opInfo = ksb[0].split(fieldSeperator);
		var opMode 					= opInfo[0];
		var opModeStyleSheetClass 	= opInfo[1];
		
		if(document.getElementById('opMode')){
			document.getElementById('opMode').innerHTML = opMode;
			document.getElementById('opMode').setAttribute("className", opModeStyleSheetClass,0); ;
		}
		
		
		for(i=1; i<ksb.length; i++){
		
			if(ksb[i] != ksbOld[i] || ksb.length != ksbOld.length){
				//alert('Et ändert sisch dennoch watt!');
				changes++;
				var productfields = ksb[i].split(fieldSeperator);
				var pnrLabel 				= productfields[0];
				var pnr 					= productfields[1];
				var LISTE 					= productfields[2];
				var POSITION				= productfields[3];
				var BANDID					= productfields[4];
				var SAT						= productfields[5];
				var BM						= productfields[6];
				var SPERRSTATUS				= productfields[7];
				var GUI_FP					= productfields[8];
				var CODELEISTE				= productfields[9];
				var CodeView				= productfields[10];
				var CorporateLogo			= productfields[11];
				var bmImg					= productfields[12];
				var bmImgTitle				= productfields[13];
				var SPERRSTATUSBGCOLORTAG	= productfields[14];
				var LISTEBGCOLOR			= productfields[15];
				
				
				for(y=0; y<ksbProducts.length; y++ ){
					//Gibt es in ksbProducts noch nummern die ich nicht (mehr) in dataStream habe?
					if(dataStream.indexOf( ksbProducts[y] ) == -1){
						// dannn löschen
						//alert('lösche nummer ' + ksbProducts[y]);
						document.getElementById('basisDataTableTbody').removeChild(document.getElementById(ksbProducts[y]));
						ksbProducts.splice(y,1);
						//document.getElementById(ksbProducts[y]).style.display = 'none';
						
					}
				}
				

			
				if(pnr != ''){
					listChanged = false;
					if(document.getElementById(pnr)){
						var elementToMove = document.getElementById(pnr);
						var reSelectTableRow = false;
						//Listenfeld ändern	
						//Kopie an gewünschte Stelle (inserationPoint.1) anhängen
						if(document.getElementById(pnr + '.LISTE').value != LISTE){
						
							if(pnr == lastHistoryEntry){
								deSelectTableRow();
								reSelectTableRow = true;
							}
							
							document.getElementById(pnr + '.LISTE').value = LISTE;
							var inserationPoint = document.getElementById("inserationPoint." + LISTE);
							inserationPoint.parentNode.insertBefore(elementToMove, inserationPoint);
							
							listChanged = true;
						}
						//Listenfarbe ändern
						elementToMove.setAttribute("bgcolor", LISTEBGCOLOR, 0);
												
						//FP ändern
						fps.updateOnChange(pnr + '.EVENT', GUI_FP);
							
						//Sperrstatus						
						fps.updateOnChange(pnr + '.SPERRSTATUS' , SPERRSTATUS);
						document.getElementById(pnr + '.SPERRSTATUS_DATA').value = SPERRSTATUS;
							
						if(SPERRSTATUS != '') {
							document.getElementById(pnr + '.SPERRSTATUS').setAttribute("bgcolor", '#FF0000',0);
							document.getElementById(pnr + '.SPERRSTATUS').innerHTML = '<b>' + SPERRSTATUS + '</b>';
						}
							
						//POSITION						
						//fps.updateOnChange(pnr + '.POSITION' , POSITION);
						
						if(reSelectTableRow){
							selectTableRow(pnr, true);
						}
					}else{
						
						//nein: 
						//neue Zeile anlegen
						
						asyncRequest("classes/getProductData.php?&pnr=" + pnr + "&GROUP_NAME=" + groupName, "createNewProduct");
						//alternative
						//location.reload();
						
					}
			
				}
				if(document.getElementById('productCount')){
					document.getElementById('productCount').innerHTML = ksbProducts.length;
				}
			}
			
		}
		currentProductsString = dataStream;
	}
}

Wo ist die Schwachstelle? Die Daten kommen Komma-Separriert und müssen auseinander genommen werden. Wäre es zum Beispiel schneller wenn ich die Element per nextSibiling statt per getElementById anspreche?
 
Zuletzt bearbeitet:
In welcher Art und Weise werden deine Daten aktualisiert? Also ändern sich immer nur einzelne Datensätze oder kommen nur neue Datensätze dazu oder was heißt bei dir aktualisieren?
 
Ich bekomme immer eine komplette Liste: Alte fliegen raus, neue kommen dazu und bei bestehenden können sich im Prinzip alle Attribute mit ID ändern.
 
Dann wäre es trotzdem schon einmal besser, wenn du deine Daten in drei Bereiche einteilen würdest: neu, alt und aktualisiert. Somit musst du auch nur ändern, was unbedingt nötig ist. Wenn du dann deine Datensätze eindeutig durch eine ID kennzeichnest, dürfte dem nichts mehr im Wege stehen.
 
Mmmokay. Aber wie so ich das trennen? Klar: Die Routinen zu Trennen macht Sinn. Die Datensätze jedoch kommen ja in einer List eingeflogen. Meinst Du, dass ich die Liste dann erstmal nach alt,neu und veraltet sortieren sollte?
 

Neue Beiträge

Zurück