Hi,

ich habe ein kleines Problem mit dem XMLHttpRequest-Objekt. Ich benutze das Ding in einer Firefox-Extension, und die soll natürlich unter Windows/Linux/MacOS funktionieren...

Wenn ich das richtig verstehe, dann habe ich 3 "Listener", die ich setzen kann: onload, onerror, onreadystatechange. Diese verhalten sich aber unterschiedlich: Ist z.B. die Datei, die ich auslesen will, nicht verfügbar, so bricht Firefox unter Windows irgendwann (ca. 20 Sekunden) den Versuch ab und ruft die unter onerror angegebene Funktion auf. Unter MacOS passiert das nicht - ein Request dauert in dem Fall ewig und drei Tage.

Außerdem: Wann benutze ich onload und wann onreadystatechange? Im Moment benutze ich onreadystatechange, aber den Vorteil sehe ich nicht, da (unter Windows) fehlgeschlagene Requests trotzdem nach ca. 20 Sekunden abgebrochen werden (und ich mir demnach den entsprechenden Code schenken könnte).

Ich schmeiß euch mal nen Haufen Code an den Kopf, vielleicht hat ja einer Zeit und Lust, mal drüberzuschauen...

Grüße,
Christian


Code:
var requestRunning;
var requestStartTime;
var request;

function loadStatus()
{
	var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
	if (ioService.offline)
	{
		return;
	}
	if (requestRunning)
	{
		return;
	}
	requestRunning = true;
	requestStartTime = (new Date()).getTime();
	
	try {
		request = new XMLHttpRequest();
	} catch (e) {
		request = null;
	}
	
	if (request != null)
	{
	  	request.onreadystatechange = updateStatus;
//	  	request.onload = updateStatus;
	  	request.onerror = updateStatusError;
	  	request.open("GET", "http://bla.blub.de/status");
	  	request.send(null);
	}
	else
	{
		alert(strings.getString("fsf.error.xmlrequest"));
		requestRunning = false;
	}
}

function updateStatus()
{
	if (request.readyState == 4)
	{
		if (request.status == 200)
		{
		  	if (request.responseText.match("1"))
		  	{
		  		updateStatusPanel("open", strings.getString("fsf.fs.open"));
		  	}
		  	else if (request.responseText.match("0"))
		  	{
		  		updateStatusPanel("closed", strings.getString("fsf.fs.closed"));
		    }
		  	else
		  	{
		  		updateStatusPanel("unknown", strings.getString("fsf.fs.unknown"));
		    }
		}
	  	else
	  	{
	  		updateStatusPanel("unknown", strings.getString("fsf.fs.unknown"));
	    }
	    
		request = null;
		requestRunning = false;
	}
  	else
  	{
  		var time = (new Date()).getTime() - requestStartTime;
  		if (time > 10000)
  		{
	  		updateStatusPanel("unknown", strings.getString("fsf.fs.unknown"));
			request.abort();
			request = null;
			requestRunning = false;
  		}
	}
}

function updateStatusError()
{
	updateStatusPanel("unknown", strings.getString("fsf.fs.unknown"));
	request = null;
	requestRunning = false;
}