kasztan: Reihenfolge der Ausführung im Explorer

Hallo,
habe das Problem, daß der Explorer die Reihenfolge der Ausführung ändert und ich nicht das gewünschte Ergebniss bekomme.

Was passiern soll:
1. Div Layer halb durchsichtig machen
2. asynchron Daten über ein HTTP Request einlesen
3. Div Ihhalt ändern
4. Div wieder undurchsichtig machen

Was passiert:
1. asynchron Daten über ein HTTP Request einlesen
2. Div Ihhalt ändern
3. Div Layer halb durchsichtig machen
4. Div wieder undurchsichtig machen

habe folgenden Quelltext:

  
function loadContent(target,db,table,id,kind,parameter){  
	opacity(document.getElementById(kind+"_"+target),0.5);  
  httpgetNewContent.open("GET",system_domain+"/index.php?get_id_only="+id+"&db="+db+"&table="+table+"&id="+id+"&kind="+kind+"&old_eid="+target+"&"+parameter, false);  
	httpgetNewContent.send(null);  
document.getElementById(kind+"_"+target).innerHTML=httpgetNewContent.responseText;  
	opacity(document.getElementById(kind+"_"+target),1);  
}

Der Firefox verhält sich richtig.
Habe versucht das Laden und ersetzen in eine extra Funktion zu packen, aber es hilft nicht.

Die Funktion opacity enthält keine Fehler
Der Inhalt wird richtig geladen.

Bitte um Hilfe, wie ich den Explorer dazu bringe die Reihenfolge der Anweisungen richtig zu verarbeiten, möglichst ohne synchrone Aufrufe nutzen zu müssen.

Danke im voraus

  1. Bitte um Hilfe, wie ich den Explorer dazu bringe die Reihenfolge der Anweisungen richtig zu verarbeiten, möglichst ohne synchrone Aufrufe nutzen zu müssen.

    Das geht nicht so wie du es machst. Wenn du einen asnychronen AJAX Request machst, dann kannst du natürlich erst in der Callback Funktion, die nach erfolgreichem Request aufgerufen wird, das machen was du willst.

    Dein Code sollte so auch nicht im Firefox funktionieren, zumindest nicht, wenn der HttpRequest wirklich asynchron ist.

    Struppi.

    1. Das geht nicht so wie du es machst. Wenn du einen asnychronen AJAX Request machst, dann kannst du natürlich erst in der Callback Funktion, die nach erfolgreichem Request aufgerufen wird, das machen was du willst.

      Naja, es hat vorher wirklich alles gut Funktioniert, außer der Reihenfolge im Explorer. Jetzt habe ich es halt synchron gemacht und mit einer Callback Funktion. So funktioniert es, ich finde es hätte aber auch ohne der callback Funktion gehen müssen.

      Der Browser muß doch im Stande sein eine Programmzeile nach der anderen abzuarbeiten, vor allem gerade dann, wenn die Javascript Engine die Ausführung stoppt bis der Request verarbeitet ist, was ja bei einer asynchronen abfrage der Fall ist.

      Danke für deine Hilfe

      1. Hallo,

        Der Browser muß doch im Stande sein eine Programmzeile nach der anderen abzuarbeiten, vor allem gerade dann, wenn die Javascript Engine die Ausführung stoppt bis der Request verarbeitet ist, was ja bei einer asynchronen abfrage der Fall ist.

        nein. Genau umgekehrt :-) Du vertauschst synchron und asynchron, siehe Wikipedia, Asynchrone Kommunikation.

        Freundliche Grüße

        Vinzenz

        1. nein. Genau umgekehrt :-) Du vertauschst synchron und asynchron, siehe Wikipedia, Asynchrone Kommunikation.

          Sorry, :schämunendlich. Ändert aber nichts an der Tatsache daß Zeile 78 vor Zeile 79 verarbeitet werden sollte, wenn es einen einfachen, linearen Quelltext gibt.

          Naja, egal. Für alle die es interessiert, das Problem habe ich so gelöst:

            
          function loadContent(target,db,table,id,kind,parameter){  
          		this.target = target;  
          		this.db = db;  
          		this.table = table;  
          		this.id = id;  
          		this.kind = kind;  
          		this.parameter = parameter;  
            	if(httpgetNewContent.readyState==4 || httpgetNewContent.readyState==0){  
          		httpgetNewContent.open("GET",system_domain+"/index.php?get_id_only="+id+"&db="+db+"&table="+table+"&id="+id+"&kind="+kind+"&old_eid="+target+"&"+parameter, true);  
          		httpgetNewContent.send(null);  
          		httpgetNewContent.onreadystatechange = handleNewContent;  
          		}	  
          }  
            
          function handleNewContent(){  
          	if(httpgetNewContent.readyState!=4 && httpgetNewContent.readyState!=0){  
          		opacity(document.getElementById(kind+"_"+target),0.5);  
          		handleretry=setTimeout(function(){handleNewContent(target,db,table,id,kind,parameter);},125);  
          	}else{  
          		document.getElementById(kind+"_"+target).innerHTML=httpgetNewContent.responseText;  
          		opacity(document.getElementById(kind+"_"+target),1);  
          		clearTimeout(handleretry);  
          	}  
          }  
          
          

          Ist jetzt fast 3x so lang. Muß ich den clearTimeout(handleretry); eigentlich machen? Ich glaub in dem Fall nicht, oder?

          Besonderheit hierbei war die Übergabe der Parameter:
          1. Will ich an die Callback Funktion Parameter übergeben muß ich Sie mit this. in der Hauptfunktion registrieren
          2. Wenn der request nicht fertig ist, muß das Handling nochmal mit parametern in setTimeout aufgerufen werden. Dazu muß man erstmal auf diese umständliche schreibweise mit setTimeout(function(){handleNewContent(parameter);},125); kommen.

          Genau deshalb denke ich daß meine erste Lösung viel sauberer war, was der Explorer ja nicht mitmachen will. Vielleicht findet sich aber Jemand der den Code kürzen kann/möchte. Das kann für viele Andere auch interessant sein weil ja viele direkt vor dem request die Transparenz hochfahren bzw. einen Ladeicon einblenden wollen.

          Gruß und Dank

          1. nein. Genau umgekehrt :-) Du vertauschst synchron und asynchron, siehe Wikipedia, Asynchrone Kommunikation.

            Sorry, :schämunendlich. Ändert aber nichts an der Tatsache daß Zeile 78 vor Zeile 79 verarbeitet werden sollte, wenn es einen einfachen, linearen Quelltext gibt.

            Genau.

              handleretry=setTimeout(function(){handleNewContent(target,db,table,id,kind,parameter);},125);  
            

            }else{

            Was soll das bewirken? Der HttpRequest ist fertig, warum willst du die Funktion noch mal aufrufen?

            1. Wenn der request nicht fertig ist,

            Die Funktion wird aufgerufen, wenn der Request fertig ist. Das macht der onreadystatechange Handler.

            Das kann für viele Andere auch interessant sein weil ja viele direkt vor dem request die Transparenz hochfahren bzw. einen Ladeicon einblenden wollen.

            Ich glaube das ist eher das Problem, wenn du es so machen willst, darfst du den Request erst aufrufen, wenn die Tranparenz Funktion fertig ist.

            Struppi.

            1.   handleretry=setTimeout(function(){handleNewContent(target,db,table,id,kind,parameter);},125);  
              }else{  
              

              Was soll das bewirken? Der HttpRequest ist fertig, warum willst du die Funktion noch mal aufrufen?

              »»

              Der Request ist onreadystatechange noch nicht fertig, erst hat er ja den Status 3. Man braucht die Callback Funktion ja erst wenn er Status 4 hat weil ja erst dann die Daten da sind. Ohne den Timeout habe ich keine Daten bekommen und der Status war 3. Je nach Aufwand der Abfrage im PHP Teil sind die Daten ja erst ein paar milisekunden bis paar sekunden später da.

              Ich glaube das ist eher das Problem, wenn du es so machen willst, darfst du den Request erst aufrufen, wenn die Tranparenz Funktion fertig ist.

              Das habe ich ja in meinem ersten Post zu machen versucht und es ging im Firefox aber nicht im Explorer 8, auch nicht im 7er Modus.

              Gruß Martin

              1. Hi,

                Der Request ist onreadystatechange noch nicht fertig, erst hat er ja den Status 3. Man braucht die Callback Funktion ja erst wenn er Status 4 hat weil ja erst dann die Daten da sind.

                Der readyState durchläuft die verschiedenen Phasen, und die Callback-Funktion wird bei jeder Änderung aufgerufen.
                Deshalb fragt man dort idR. den Status auf 4 ab, und macht erst dann etwas mit den Daten, die dann zur Verfügung stehen.

                Ohne den Timeout habe ich keine Daten bekommen und der Status war 3.

                Dann machst du etwas falsch.

                Je nach Aufwand der Abfrage im PHP Teil sind die Daten ja erst ein paar milisekunden bis paar sekunden später da.

                Wenn readyState == 4 ist, dann sind sie da.

                Hier mit Timeouts zu arbeiten, ist unsinnig, fehleranfällig und einfach vom Prinzip her falsch.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. boaaaaah, jetzt ist mir ein Licht aufgegeangen. Stimmt, das onreadystatechange wird ja mehrmals aufgerufen. Bei meinen ersten Versuchen hat das später nicht funktioniert weil ich die Parameter mit this. nicht registriert habe.

                  Es geht jetzt auch ohne Timeout :). Und das mit dem Callback Aufruf bei der opacity Funktion stimmt natürlich auch.
                  Es ging deshalb nicht weil ich da Eventgetriggerte Sachen mit linearer Ausführung gemischt habe.

                  Danke, Ihr habt mir die Augen geöffnet.

                  Gruß

              2.   handleretry=setTimeout(function(){handleNewContent(target,db,table,id,kind,parameter);},125);  
                }else{  
                

                Was soll das bewirken? Der HttpRequest ist fertig, warum willst du die Funktion noch mal aufrufen?
                »»

                Der Request ist onreadystatechange noch nicht fertig, erst hat er ja den Status 3.

                Jein, die Funktion wird in jedem Status aufgerufen (das kann je nach Browser variieren, aber 3 und 4 werden immer aufgerufen) , deshalb prüfst du ja auch explizit auf 4.

                Man braucht die Callback Funktion ja erst wenn er Status 4 hat weil ja erst dann die Daten da sind. Ohne den Timeout habe ich keine Daten bekommen und der Status war 3.

                Dann hast du etwas falsch gemacht. Der Timeout ist definitiv nicht nötig.

                Ich glaube das ist eher das Problem, wenn du es so machen willst, darfst du den Request erst aufrufen, wenn die Tranparenz Funktion fertig ist.

                Das habe ich ja in meinem ersten Post zu machen versucht und es ging im Firefox aber nicht im Explorer 8, auch nicht im 7er Modus.

                Ich kann in dem Post das nicht erkennen. Du musst in deiner Transparentfunktion einen Callback Aufruf einbauen, der dann erfolgt, wenn der Vorgang abgeschlossen ist.

                Das ist der Unterschied zwischen einer linearen und einer Eventbasierten Programmierung. Immer dort wo auf Dinge gewartet werden muss, musst du die zweite Art verwenden.

                Struppi.