Ajax - prüfen ob ein request noch utnerwegs ist

bandsite

Mitglied
Hallo Leutz,

Ich aktualisiere den Inhalt eines DIV's mittels AJAX, ich verwende dazu folgenden Code:
Code:
	function createRequestObject()
	{
		var ro;
		var browser = navigator.appName;
		if(browser == "Microsoft Internet Explorer")
		{
			ro = new ActiveXObject("Microsoft.XMLHTTP");
		}
		else
		{
			ro = new XMLHttpRequest();
		}
		return ro;
	}

	var http = createRequestObject();

	function sndHtml(id, exercise_id)
	{
		http.open('get', 'update.php?id='+id+'&exercise_id='+exercise_id);
		http.onreadystatechange = handleSndHtml;
		http.send(null);
	}				

	function handleSndHtml() {
		if(http.readyState == 4){
			var response = http.responseText;
			var update = new Array();
	
			if(response.indexOf('|' != -1)) {
				update = response.split('|');
				document.getElementById(update[0]).innerHTML = update[1];
			}
		}
	}

Es funktioniert auch alles wunderbar, es tritt nur manchmal folgender Fehle auf (Firefox Javascript Konsole):

Fehler: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: http://localhost/eftect/eftecs.js :: sndHtml :: line 30" data: no]

Das Problem taucht auf, wenn der User zu schnell erneut auf den Link klickt, der das DIV aktualisiert ...., weil der vorherige Request ist noch nicht abgeschlossen ist.

Ich suche nun nach einer Möglichkeit herauszufinden ob ein abgefeuerter Request noch auf dem Weg ist, oder nicht. Kann mir jemand weiterhelfen?

Gruß und Dank, bandsite
 
Hi,

Du könntest jedes mal, wenn der Link betätigt wird, ein neues Request-Objekt erstellen und abarbeiten lassen.
Code:
  var http = false;

  function sndHtml(id, exercise_id)
  {
    // Falls noch ein Request-Objekt existiert
    if(http && http.readyState){
      http.abort();
      http = false;
    }

    // Request-Objekt erstellen
    http = createRequestObject();

    http.open('get', 'update.php?id='+id+'&exercise_id='+exercise_id);
    http.onreadystatechange = handleSndHtml;
    http.send(null);
  }

  function handleSndHtml() {
    if(http.readyState == 4){
      if(http.status == 200){
        var response = http.responseText;
        var update = new Array();

        if(response.indexOf('|' != -1)) {
          update = response.split('|');
          document.getElementById(update[0]).innerHTML = update[1];
        }
      }
    }
  }
Ausserdem solltest Du beim Verarbeiten der Daten prüfen, ob der HTML-Status passend ist (200).

Eine andere Möglichkeit wäre, den Link für die Dauer des Requests inaktiv zu setzen (onclick-Event
modifizieren). Nach dem erfolgreichen Empfang der Daten wird der Event wieder zurückgesetzt.

Vielleicht hilft Dir das weiter.

Ciao
Quaese
 
=), da muss ich mich wieder bei dir bedanken... Danke für deine Hilfe, besonder im bezug auf den HTML Status!

Gruß, bandsite
 
Zurück