[FRAGE] AJAX/JS request funktioniert nicht in IE oder Chrome

hans_wurst

New member
Hallo,

ich möchte ein kleines Script schreiben, das alle Terminalserver im Unternehmen analysiert.
Da der Zugriff per WMI sehr langsam ist, möchte ich den Zugriff nacheinander per AJAX durchführen und anzeigen lassen. Das funktioniert im FF wie gewünscht, im IE leider gar nicht und im Chrome nicht einzeln. Chrome durchläuft alle Server und gibt dann erst das Ergebnis aus, statt nach jedem Server das Ergebnis anzuzeigen.

Folgenden Code nutze ich um den AJAX request auszulösen:
Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="tsmanager.css">
<script type="text/javascript">
	function refreshall()
	{
		var table = document.getElementById("terminalservers");
		for (var i = 0, row; row = table.rows[i]; i++)
		{
			var sComputer = row.id;
			if (sComputer != "")
			{
				setTimeout(refresh(sComputer), 2000);	
				setTimeout(document.getElementById("turn").innerHTML = sComputer, 2000);	
			}

		}

	}
	
	function refresh(sComputer)
	{
		if (window.XMLHttpRequest)
		{
			req = new XMLHttpRequest();
		}
		else 
		{
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
		req.onreadystatechange = function()
		{
			if (req.readyState == 4 && req.status == 200)
			{
				document.getElementById(sComputer).innerHTML = req.responseText;
			}
		}
		req.open("GET", "serverrequest.php?name="+sComputer, false);
		req.send();
	}
	
</script>
</head>
<body>
<table id="terminalservers">

  /* some table content with row id=servername */


</table>	
<button onclick="refreshall()">alle</button>
<br><span id="turn">leer</span>
</body>
</html>
Ich möchte eine Bibliothek, wie jquery, vermeiden.
Wie kann ich das Script ändern, dass es auch im IE 9/10/11 und Chrome ordentlich funktioniert?

Vielen Dank für eure Mühen.

MfG
 
Du machst da kein AJAX, sonder SJAX. Deswegen wird der Browser geblockt, bis alle Requests durchgelaufen sind (das erklärt das Verhalten des Chrome... ehrlich gesagt überrascht mich der FF da ein wenig). Warum willst du die denn unbedingt synchron ausführen? Dadurch musst du doch einfach nur länger warten, bis alle abgefragt wurden...

Warum der IE gar nichts macht, kann ich gerade nicht erklären... steht etwas in der Fehlerkonsole?

PS: globale Variablen sind gar keine gute Idee. Mach' deine "req"-Variable lokal.
PPS: deine window.setTimeout()s machen exakt gar nichts, denn du übergibst ihnen keine Funktionsreferenzen als Parameter.
 
Hi,
danke für die Antwort.
Ja, eigentlich mache ich SJAX und es ist nicht die beste Variante. Mache ich einen asynchronen request, funktioniert nichts mehr. Ich kann mir das nicht erklären warum. Aber asynchron funktioniert nicht mit dem Script. Da aktualisiert/bearbeitet er nur den letzten Server. Deswegen synchron.
Asynchron geht der Farbwechsel im FF nicht einmal mehr und im Chrome auch nicht. IE geht immer noch nicht :D

Der IE bringt keinen Fehler in der Statusleiste. Er scheint die Hintergrundfarbe auf weiß zu wechseln nach dem Bearbeiten, vor dem Bearbeiten aber nicht auf grün und Daten werden auch nciht aktualisiert.

Mit den setTimeout hast du natürlich Recht. Das waren noch Reste von den Tests mit Chrome, ob ich in irgend einer Weise in die Richtung was machen kann.

Die req Variablen sind doch in den Funktionen. Warum sind die global?

Wie du siehst, habe ich relativ wenig Ahnung von JS. Trotzdem nochmal danke für die Hilfe. Wäre echt toll, wenn mir irgend jemand sagen kann, warum es asynchron nicht geht und warum
 
wer lesen kann...
Danke für die Erinnerung. Ist wohl nicht meine Woche.

Also die Requestcodes bestehen aus mehreren Funktionen, aber ich versuche es mal:

Code:
//Erst Abfrage nach Aufgabe via $_GET, dann Verbindung zum WMI:
$oWbem = new COM("WbemScripting.SWbemLocator");
$oWMI = $oWbem->ConnectServer($sComputer, $sNamespace, $sUser, $sPassword, "MS_409", "ntlmdomain:" . $sDomain);
$oWMI->Security_->ImpersonationLevel = 3;
$oWMI->Security_->AuthenticationLevel = 6;

//Beispiel einer WMI Abfrage:
$oList = $oWMI->ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True");
foreach ($oList as $oItem)
$sIp = "";
{
	$sIp = $sIp . " " . $oItem->IPAddress(0);
}
//ein paar Datenbankabfragen bzw. Updates dazwischen und dann Ausgabe der Tabellenzeile:
echo "\n<tr>";
.
.
.
echo "\n\t<td>$sIP</td>";
.
.
.
echo "\n</tr>";

Ich mache also ein paar WMI Abfragen, die sehr lange dauern und ein paar schnelle DB-Zugriffe und übergebe dann eine Zeile der Tabelle meines TS-Managers.
Braucht ihr noch andere Infos?
 
Ich meinte eigentlich den asynchronen JS-Code - der oben ist ja synchron.

... aber der PHP-Code kann auch nicht schaden.
 
Hm... das sollte dann eigentlich funktionieren... mehr oder weniger...

Probier' mal das:
Code:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="tsmanager.css">
<script>
	function refreshall(){
		var table = document.getElementById("terminalservers");
		for (var i = 0, row; row = table.rows[i]; i += 1){
			var sComputer = row.id;
			if (sComputer){
				refresh(sComputer);	
			}
		}
	}
	
	function refresh(sComputer){
		var turnNode = document.createElement("span");
		turnNode.appendChild(document.createTextNode(sComputer));
		document.getElementById("turn").appendChild(turnNode);
		var req;
		if (window.XMLHttpRequest){
			req = new XMLHttpRequest();
		}
		else {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
		req.onreadystatechange = function(){
			if (req.readyState == 4 && req.status == 200){
				document.getElementById(sComputer).innerHTML = req.responseText;
				turnNode.parentNode.removeChild(turnNode);
			}
		}
		req.open("GET", "serverrequest.php?name="+sComputer, true);
		req.send();
	}
	
</script>
</head>
<body>
<table id="terminalservers">

  /* some table content with row id=servername */


</table>	
<button onclick="refreshall()">alle</button>
<br><span id="turn"></span>
</body>
</html>
 
Hallo,

entschuldigt, dass ich mich erst so spät melde. Also im Chrome funktioniert es jetzt auch so. Vielen Dank :)
Der IE ist mir egal. Inzwischen ist das ganze kleine Programm schon mehrere tausend Zeilen groß und nimmt Gestallt an.
Vielen Dank für eure Hilfe.

MfG
 
Zurück
Oben