SorgenKindMech: xmlHttp und der richtige umgang

Huhu liebes Forum,

ich habe mich nun das erste mal mit AJAX beschäftigt und noch eine paar kleine fragen

ich mein im grunde hab ich das vorher immer mir einem verstecktem frame gehandhabt ... ging ja genauso ;)

aber zum thema: mein projekt besteht aus 2 frames, navigation und inhalt
um nun nicht überall ein js einbinden zu müssen hab ich mir gedacht, baust es in der navigation ein, die is eh immer da ^^

so sieht das ding aktuell aus:

  
var xmlHttp = null;  
function request_fkt(ziel)  
{  
	var xmlHttp = null;  
	try {  
		// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)  
		xmlHttp = new XMLHttpRequest();  
	} catch(e) {  
		try {  
			// MS Internet Explorer (ab v6)  
			xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");  
		} catch(e) {  
			try {  
				// MS Internet Explorer (ab v5)  
				xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");  
			} catch(e) {  
				xmlHttp  = null;  
			}  
		}  
	}  
	if (xmlHttp)  
	{  
		xmlHttp.open('GET', ziel, true);  
		xmlHttp.onreadystatechange = function () {  
			if (xmlHttp.readyState == 4) {  
				if(xmlHttp.responseText!="1")  
				{  
					try  
					{  
						eval(xmlHttp.responseText);  
					}  
					catch(e)  
					{  
						  
						fehlerfenster=window.open("about:blank","fehlerfenster","status=no");  
						fehlerfenster.document.write("<textarea style=\"width:100%; height:100%\">" + String(xmlHttp.responseText) + "</textarea>");  
					}  
				}  
			}  
		};  
		xmlHttp.send(null);  
	}  
	else return "konnte XMLHttpRequest nicht initialisieren";  
}  

man sieht hier, dass es eine leicht abgewandelte version aus der wikipedia ist

sind vielleicht anfängerfragen aber hier sind sie:

wenn ich ein request absetze, und vor der antwort noch ein request absetze, wird dann die erste antwort überhaupt noch ausgewertet?
so wie ich das sehe ist die variable xmlHttp global, und somit wird sie bei erneutem aufruf der funktion überschrieben, sprich eigendlich müsste ich doch die erste zeile raus nehmen damit mir das nicht passiert oder?

zweite frage: wie man sieht, lasse ich mir im fehlerfall ein fenster öffnen, und schreibe den rückgabewert in das fenster zur kontrolle
normalerweise soll ja kein fehler vorkommen aber WENN doch mal (datenbank weg, etc) dann ist es aktuell so, dass das fenster aufgeht, der rückgabewert rein geschrieben wird und dann nix mehr
beispiel: wie so oft vergisst man (oder nur ich) im php-script ein semikolon oder eine klammer, ergo bekomme ich einen fehler, der im fenster dargestellt wird
fehler wird gesucht, gefunden, behoben
ich führe die abfrage erneut aus, und was ist? er zeigt mir den selben fehler, selbst wenn ich den frame mit der navigation neulade

es funktioniert erst wieder, wenn ich die komplette seite neulade, also einmal F5, erst dann funktioniert wieder alles normal

dieses verhalten möchte ich selbstverständlich strikt vermeiden, wenn man ein fehler auftritt - ok, aber dann muss es auch bei der nächsten abfrage wieder funktionieren und nicht einfach sagen "öhm ... nö"

weiß jemand rat?

danke schonmal im voraus ;)

euer Sorgenkind

  1. weiß jemand rat?

    Sende mit der Antwort auf den Request einen header, welcher das Cachen der Antwort durch den Browser untersagt.

    Lies nach, was Du tust, bevor Du das einbaust:

    [link:http://php.net/manual/de/function.header.php@title=header]('[link:http://www.mnot.net/cache_docs/@title=Cache-Control:max-age=0,no-cache,private]');

    1. weiß jemand rat?

      Sende mit der Antwort auf den Request einen header, welcher das Cachen der Antwort durch den Browser untersagt.

      Lies nach, was Du tust, bevor Du das einbaust:

      [link:http://php.net/manual/de/function.header.php@title=header]('[link:http://www.mnot.net/cache_docs/@title=Cache-Control:max-age=0,no-cache,private]');

      ich danke dir ;)

      funktioniert super, ich dachte ursprünglich, dass ich das cache-verhalten schon ausreichend geregelt hätte ... nunja, irrtum ;)

      hast du zuuuufällig auf meine erste frage auch noch eine antwort?

      vielen dank erstmal bis hierhin!

      1. Du hast einmal in der Funktion und einmal im globalen scope

        var xmlHttp = null;

        stehen.

        Der Browser sendet den Request, wartet auf das Ergebnis um es dem Objekt zu geben. Jetzt wird das Objekt aber zerstört und neu aufgebaut. Wie würdest Du den Browser programmieren?

        Richtig. Da das alte Objekt nicht mehr da ist verwirft er die Daten - falls die für das alte Objekt womöglich doch noch kommen.  Oder er hört sogar damit auf an einem Port auf die Daten für den alten Request zu warten. In dem Fall wird dann das Betriebssystem die dafür geöffnete Verbindung zum Server schließen.

        fred

        1. Tach!

          Da das alte Objekt nicht mehr da ist verwirft er die Daten - falls die für das alte Objekt womöglich doch noch kommen.  Oder er hört sogar damit auf an einem Port auf die Daten für den alten Request zu warten. In dem Fall wird dann das Betriebssystem die dafür geöffnete Verbindung zum Server schließen.

          Ich denke, der tatsächliche Vorgang ist etwas anders. Der Browser möchte eine Verbindung zum Webserver haben. Dazu redet er mit seinem TCP/IP-Stack, also der Transportschicht "unter" ihm. Was der lokale TCP/IP-Stack dazu machen muss, um eine Verbindung zum Server aufzubauen, ist dem Browser im Prinzip egal - insbesondere, dass der Stack dazu eine eigene Port-Nummer für die Antwort-Pakete benötigt. Der Browser schickt seinen HTTP-Request nach "unten" und bekommt über denselben Kanal die Antwort. Wenn der Browser nun aufgrund des nicht mehr benötigten XHR-Objekts die Verbindung nicht weiter bedienen will, dann schließt er den Kommunikationskanal zu seinem TCP/IP-Stack. Das Verwerfen der ankommenden Pakete ist für den Browser nicht mehr relevant sondern obliegt dann dem TCP/IP-Stack. Der wird aber nicht passiv auf noch eintrudelnde Pakete warten. Da HTTP über TCP läuft, kann er selbst den Verbindungsabbau einleiten.

          dedlfix.

          1. Tach!

            Ja. Soweit ich das überblicke ist Deine Ausführung richtig. Natürlich ist das TCP/IP-Geschwurbel Sache des Stacks und damit des Betriebssystems.

            Fred

            1. Tach!

              Ja. Soweit ich das überblicke ist Deine Ausführung richtig. Natürlich ist das TCP/IP-Geschwurbel Sache des Stacks und damit des Betriebssystems.

              Fred

              danke euch auf jeden fall!

              ich habe letztendlich die globale deklaration entfernt, und durch tests nun auch festgestellt, dass mehrere requests parallel laufen können, sprich ich setze mehrere hintereinander ab (wo ich weiß, dass die auch mal ne sekunde dauern) und alle antworten kommen korrekt an, tolle sache sowas ;)

              so, dies nur als nachtrag sofern es jemanden interessiert ;)

              LG das SorgenkindMech

    2. Tach!

      Sende mit der Antwort auf den Request einen header, welcher das Cachen der Antwort durch den Browser untersagt.
      [link:http://php.net/manual/de/function.header.php@title=header]('[link:http://www.mnot.net/cache_docs/@title=Cache-Control:max-age=0,no-cache,private]');

      Ich nehme zum Caching-Verhindern immer kurz und schmerzlos

      Expires: 0

      Das gibt es bereits seit HTTP 1.0. Cache-Control gibt es zwar erst seit HTTP 1.1, was aber auch bereits ausreichend lange existiert, dass Cache-Control von allen wesentlichen Caches erkannt werden sollte.

      dedlfix.