dude: mehrere Divs per Ajax laden

Hi,

habe Probleme 2 divs gleichzeitig zu laden.

Wer kann helfen?

http://test.dbf.de1.cc/

-> auf gal_1 klicken!

Dann wird meist nur das rechte DIV aktualisiert
bzw. wird links der gleich Inhalt wie rechts angezeigt
was jedoch falsch und für mich nicht logisch ist!

Gruß
Siggi

  1. Hallo dude,

    was da geschieht, ist absolut logisch. Du sendest zwei Requests asynchron. Sie laufen also parallel. Daher konkurrieren sie, den Du speicherst sie in ein und derselben Variable req ab. Parallel überschreiben sich nun die beiden Anfragen gegenseitig die Eigenschaft req.readyState. Das kannst Du aber verhindern, wenn Du mehrere Variablen nutzt. Ich würde Dir dazu folgendes vorschlagen:

    var req=[];  
      
    function ahah(url, target) {  
    	document.getElementById(target).innerHTML = 'Loading...';  
      
    	if (window.XMLHttpRequest) {  
    		req[target] = new XMLHttpRequest();  
    	} else if (window.ActiveXObject) {  
    		req[target] = new ActiveXObject("Microsoft.XMLHTTP");  
    	}  
    	if (req[target] != undefined) {  
    	req[target].onreadystatechange = function() {ahahDone(url, target);};  
    	  
    	var url = url + ((url.indexOf("?") == -1) ? "?" : "&") + escape(new Date().toString()); //permet de ne pas utiliser le cache  
      
    	req[target].open("GET", url, true);  
    	req[target].send("");  
    	}  
    }  
    function ahahDone(url, target) {  
    	if (req[target].readyState == 4) {  
    		if (req[target].status == 200) {  
    			document.getElementById(target).innerHTML = req[target].responseText;  
    		} else {  
    			document.getElementById(target).innerHTML=" AHAH Error:\n"+ req[target].status + "\n" +req[target].statusText;  
    		}  
    	}  
    }
    

    Gruß aus Berlin!
    eddi

    1. hi eddi,

      danke für den tipp. es funzt ;-)

      hatte so was in der art auch vermutet.

      gruß
      siggi

      ps: aber was ist dann synchron?

      1. Re:

        ps: aber was ist dann synchron?

        synchron:

        Programmausführung -> Request -> Response abwarten -> Programmausführung

        asynchron:

        Programmausführung -> Request -> Programmausführung nur von onreadystatechange
                           |
                           `-> Programmausführung

        In Javascript wird synchron dann wie folgt notiert, wobei immer wieder die gleiche Variable genutzt werden kann:

        var req=new XMLHttpRequest(); // in aller kürze für mozillas  
          
        req.open('GET','script.php',false);  
        //                          ^^^^^  
        req.send(p);  
          
        verarbeite(req.responseText);
        

        Gruß aus Berlin!
        eddi

  2. Hi,

    habe Probleme 2 divs gleichzeitig zu laden.

    Wer kann helfen?

    Nur ein Tipp, Tagging: Falls Du mehrere Requests rausschicken willst, gib denen einen Tag, ein Integer reicht völlig. Der Request kriegt einfach eine Nummer als Parameter mit, serverseitig wird diese Nummer dann in den Etag (HTTP-Header) eingebaut und so kriegst Du die Responsen wieder zsamma ;-)

    Inwieweit die Browser solche Requests tatsächlich asynchron rausschicken ist eine andere Sache. Bisher musste ich immer wieder leider feststellen, dass die Browser die Requests schön brav nacheinader senden, nutzen somit die Bandbreiten nicht und verschwenden der Besucher Zeit ;-)

    Hotti

    1. Hi,

      Nur ein Tipp, Tagging: Falls Du mehrere Requests rausschicken willst, gib denen einen Tag, ein Integer reicht völlig. Der Request kriegt einfach eine Nummer als Parameter mit, serverseitig wird diese Nummer dann in den Etag (HTTP-Header) eingebaut und so kriegst Du die Responsen wieder zsamma ;-)

      Und wozu genau soll das jetzt gut sein?
      Wenn du zusammengehörige Daten anfordern willst - wieso dann nicht ein Request, sondern mehrere?

      Inwieweit die Browser solche Requests tatsächlich asynchron rausschicken ist eine andere Sache. Bisher musste ich immer wieder leider feststellen, dass die Browser die Requests schön brav nacheinader senden, nutzen somit die Bandbreiten nicht und verschwenden der Besucher Zeit ;-)

      Dein fehlerhaftes Verständnis von Asynchronität in diesem Zusammenhang wurde dir doch erst letzte Tage hier erklärt.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
      1. hi,

        Wenn du zusammengehörige Daten anfordern willst - wieso dann nicht ein Request, sondern mehrere?

        Ich hab ja nicht gesagt, dass es Mehrere sein müssen. Multipart Content kann selbstverständlich auch in einem Ajax-Zyklus (Request-Response) angefordert und verarbeitet werden.

        Dein fehlerhaftes Verständnis von Asynchronität in diesem Zusammenhang wurde dir doch erst letzte Tage hier erklärt.

        Auf meiner Seite erkläre ich die asynchrone Übertragung, da kannst Du gerne nochmal nachlesen, was das für Vorteile bringt, nicht nur für Ajax. Vielleicht stehts ja auch im Wiki* wie eine asynchrone Datenübertragung funktioniert. Oder denkst du, dass beim DSL-Anschluss die Kabel nur einfach dicker sind als früher? Und das bei den Kupferpreisen heute ... :-)

        Hotti

        1. Hi,

          Dein fehlerhaftes Verständnis von Asynchronität in diesem Zusammenhang wurde dir doch erst letzte Tage hier erklärt.

          Auf meiner Seite erkläre ich die asynchrone Übertragung, da kannst Du gerne nochmal nachlesen

          Nein, das kann ich mir glaube ich sparen, so lange du hier noch regelmäßig zeigst, dass dein Verständnis davon nicht viel mit der Realität zu tun hat.

          Btw., das was dir letzte Tage hier erklärt wurde, bezog sich IIRC auf eben diesen Artikel.

          MfG ChrisB

          --
          “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    2. Hallo,

      Inwieweit die Browser solche Requests tatsächlich asynchron rausschicken ist eine andere Sache. Bisher musste ich immer wieder leider feststellen, dass die Browser die Requests schön brav nacheinader senden, nutzen somit die Bandbreiten nicht und verschwenden der Besucher Zeit ;-)

      mir scheint, dir ist nicht klar, was man unter "asynchron" versteht.

      Der Begriff "synchron" kommt aus dem Griechischen und bedeutet nichts anderes, dass zwei oder mehr Prozesse in einem definierten zeitlichen Verhältnis zueinander stehen. Somit heißt "asynchron" als Negation einfach, dass zwischen diesen Prozessen *kein* zeitlicher Zusammenhang besteht.

      Mit Gleichzeitigkeit hat das aber ebensowenig zu tun wie mit streng sequentiellem Ablauf. Beides sind Sonderfälle von *synchronen* Abläufen.

      Beispiel: Ich rufe im Hotel den Zimmerservice und bestelle mir eine Kanne Kaffee aufs Zimmer. Ich warte aber nicht reglos, bis der Angestellte mit dem Kaffee kommt, sondern bringe mein Gepäck in Ordnung, lese etwas in der Zeitung oder schaue mit im Fernsehen die Nachrichten an. Irgendwann, zu einem mehr oder weniger zufälligen Zeitpunkt, klopft es dann an der Tür, und mein Kaffee ist da.
      Das ist asynchron.

      Ciao,
       Martin

      --
      Arzt:    Gegen Ihr Übergewicht hilft wohl nur noch Gymnastik.
      Patient: Sie meinen, Kniebeugen und so?
      Arzt:    Nein, Kopfschütteln. Immer dann, wenn Ihnen jemand was zu essen anbietet.
      1. moin,

        Beispiel: Ich rufe im Hotel den Zimmerservice und bestelle mir eine Kanne Kaffee aufs Zimmer. Ich warte aber nicht reglos, bis der Angestellte mit dem Kaffee kommt, sondern bringe mein Gepäck in Ordnung, lese etwas in der Zeitung oder schaue mit im Fernsehen die Nachrichten an. Irgendwann, zu einem mehr oder weniger zufälligen Zeitpunkt, klopft es dann an der Tür, und mein Kaffee ist da.
        Das ist asynchron.

        Genau. Du hast es ausgezeichnet auf den Punkt gebracht. Wesentlich ist dabei, dass über einen a. Layer die Ordnung aufgehoben ist. Und es ist ein Tagging erforderlich, damit am Ende einer a. Übertragung die Ordnung wieder hergestellt werden kann.

        Und ich soll das nicht verstanden haben, hallo!?

        Mir scheint eher, dass json-Nutzer das ISO OSI Referenzmodell nicht verstanden haben, und fleißig einen Presentation Layer zur Datenübertragung benutzen. Und warum sollte es nicht möglich sein, mehrere Ajax-Requests so zu senden, dass die nicht aufeinander warten müssen? Genau: Es ist nur deswegen nicht möglich, weil die Browser das nicht können!

        Schönen Tag Euch ;-)
        Hotti

        1. Hallo,

          [...] zu einem mehr oder weniger zufälligen Zeitpunkt, klopft es dann an der Tür, und mein Kaffee ist da.
          Das ist asynchron.
          Genau. Du hast es ausgezeichnet auf den Punkt gebracht.

          :-)

          Wesentlich ist dabei, dass über einen a. Layer die Ordnung aufgehoben ist.

          Was immer du mit einem "a. Layer" meinst - ich glaube, du bist in Gedanken schon wieder (oder immer noch?) bei einem konkreten Anwendungsfall, nicht bei der allgemeinen Definition. Es gibt auch Vorgänge, die sozusagen von Natur aus schon asynchron sind, so dass es keine Ordnung gibt, die aufgehoben werden könnte. Zum Beispiel Schüler, die morgens zur Schule gehen: Sie gehen alle unkoordiniert zu verschiedenen Zeiten von verschiedenen Orten los (dass manche auch in Grüppchen gehen, ist damit nicht ausgeschlossen), gehen auf verschiedenen Wegen und treffen zu verschiedenen Zeiten im Klassenzimmer ein. Asynchron, ohne dass es eine Ordnung gab, die durch irgendwas aufgehoben wurde.

          Und es ist ein Tagging erforderlich, damit am Ende einer a. Übertragung die Ordnung wieder hergestellt werden kann.

          Sagen wir's so: Wenn du ein geordnetes System hast, dann Teile des Systems verschiedenen asynchron laufenden Prozessen unterwirfst, musst du natürlich irgendwann die ursprüngliche Ordnung wiederherstellen (synchronisieren).
          Welche Maßnahme dazu sinnvoll ist, hängt vom konkreten Fall ab; beim asynchronen Versand mehrerer Nachrichten, die eigentlich einen festen Bezug zueinander haben, ist Tagging eine gute Methode.

          Und ich soll das nicht verstanden haben, hallo!?

          Dein vorangegangener Beitrag las sich für mich so, als sei Gleichzeitigkeit oder zumindest zeitliche Überlappung deiner Ansicht nach Voraussetzung für Asynchronität. Dem wollte ich widersprechen: Asynchronität schließt zwar Gleichzeitigkeit bzw. Überlappung nicht aus, das ist aber keine notwendige Voraussetzung.

          Und warum sollte es nicht möglich sein, mehrere Ajax-Requests so zu senden, dass die nicht aufeinander warten müssen? Genau: Es ist nur deswegen nicht möglich, weil die Browser das nicht können!

          Ist das denn wirklich so? Ich habe die AJAX-Thematik noch nie selbst untersucht, aber ich hätte behauptet, dass auch überlappende Requests möglich sind - vorausgesetzt natürlich, man verwendet getrennte Request-Objekte, sonst gibt's Durcheinander.

          So long,
           Martin

          --
          Frauen sind wie Elektrizität: Fasst man sie an, kriegt man eine gewischt.
        2. Und warum sollte es nicht möglich sein, mehrere Ajax-Requests so zu senden, dass die nicht aufeinander warten müssen? Genau: Es ist nur deswegen nicht möglich, weil die Browser das nicht können!

          Unsinn!

          Struppi.