Kalle_B: Ajax - kann eine andere Seite senden?

Hallöle,

habe erste Erfahrung mit Ajax gemacht. Bei Klick auf einen Button ruft das Programm zeitverzögert (Timeout) eine Info ab. Durch den Button- Klick wird eine Mail verschickt und die Zahl der Mails im Stammsatz um 1 erhöht. Eine Sekunde später holt sich das erste Programm die neue Zahl.

Ein anderer Button in der Besucherliste (Messe) ruft ein Programm auf, in das Kontaktwünsche für diesen Besucher eingegeben werden können. Der Abruf der Kontakt- Anzahl kann NICHT einfach mit Timeout erfolgen, da jenes Programm manuell beendet wird.

Kann ich bei Beenden des Kontakt- Programms eine Nachricht an das erste Programm schicken, oder muss das erste Programm in Zeitabständen pollen, bis eine Änderung eingetreten ist?

Lieben Gruß, Kalle

  1. Moin!

    Kann ich bei Beenden des Kontakt- Programms eine Nachricht an das erste Programm schicken, oder muss das erste Programm in Zeitabständen pollen, bis eine Änderung eingetreten ist?

    AJAX ändert am Grundsatz des Client-Requests nichts.

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Moin!

      AJAX ändert am Grundsatz des Client-Requests nichts.

      Immer gut zu wissen, dass an Grundsätzen nicht gerüttelt wird.

      Aber was heißt das im Klartext?

      http.open('get','tm_ajax.php?'+ajaxParameter );
        http.onreadystatechange = updateNewContent;
        http.send(null);

      Die Funktion updateNewContent wird aufgerufen, wenn eine Nachricht eintrifft? Auch noch zwei Stunden später?

      Dann müsste also das Programm tm_ajax.php auf die eigentliche Anfrage NICHT reagieren, sondern erst, wenn die Eingabe im zweiten Programm abgeschlossen ist?

      Hmm - und wenn mehrere User auf tm_ajax.php warten? Mir ist das Konzept nicht klar.

      Lieben Gruß, Kalle

      1. Moin!

        http.open('get','tm_ajax.php?'+ajaxParameter );
          http.onreadystatechange = updateNewContent;
          http.send(null);

        Die Funktion updateNewContent wird aufgerufen, wenn eine Nachricht eintrifft?

        Nein die Funktion wird aufgerufen, wenn sich am ready-State was ändert. Das ist im Verlauf eines Requests durchaus mehrfach der Fall - so genau habe ich mir das nicht angeschaut, aber die in allen Funktionen erfolgte Abfrage, ob der readyState==4 ist und ob dann tatsächlich HTTP-Status 200 oder 304 geschickt wurde, legen genau diese Vermutung nahe.

        Auch noch zwei Stunden später?

        Wenn ein HTTP-Request zwei Stunden dauern darf, bis er erfolgreich abgeschlossen werden kann, dann ja. Vermutlich wird aber vorher irgendeine Komponente (Server, Browser, Proxy, Router) einen Timeout verursachen.

        Bedenke auch, dass du für die gesamte Zeitdauer einen Prozess auf dem Webserver zur Nicht-Beantwortung dieses Requests blockierst.

        Dann müsste also das Programm tm_ajax.php auf die eigentliche Anfrage NICHT reagieren, sondern erst, wenn die Eingabe im zweiten Programm abgeschlossen ist?

        Wenn tm_ajax.php durch einen AJAX- oder sonstigen Request aufgerufen wird, ist dieses Skript ganz allein für die Behandlung und erfolgreiche Beantwortung verantwortlich.

        Hmm - und wenn mehrere User auf tm_ajax.php warten? Mir ist das Konzept nicht klar.

        Dann sind mehrere Prozesse mit der Ausführung einer jeweiligen Kopie dieses Skripts beschäftigt.

        Ab 250 wartenden Usern hast du dann spätestens ein Problem, weil der Apache ohne Neukompilierung unter Linux seine maximale, im Quelltext gesetzte Grenze der Anzahl laufender Prozesse erreicht.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Moin!

          danke für deine Klarstellung, ich denke, ich hab's verstanden.

          Dann müsste also das Programm tm_ajax.php auf die eigentliche Anfrage NICHT reagieren, sondern erst, wenn die Eingabe im zweiten Programm abgeschlossen ist?

          Wenn tm_ajax.php durch einen AJAX- oder sonstigen Request aufgerufen wird, ist dieses Skript ganz allein für die Behandlung und erfolgreiche Beantwortung verantwortlich.

          Das heißt, bei Ajax- Aufruf wird eine Instanz des Programms gestartet. Und nur DIESE Instanz kann antworten? Ein weiterer Start desselben Programms hat also KEINE Wirkung auf die erste Instanz?

          Dann müsste tm_ajax.php nach Aufruf im Kreis laufen, mit bester Chance, wegen Timeout abgeschossen zu werden. Also wird es so nicht gehen.

          Kalle.

          1. Moin!

            Das heißt, bei Ajax- Aufruf wird eine Instanz des Programms gestartet. Und nur DIESE Instanz kann antworten? Ein weiterer Start desselben Programms hat also KEINE Wirkung auf die erste Instanz?

            AJAX ist eine Vorrichtung, die dir erspart, einen Frame oder IFrame zu erzeugen, darin location.href zu ändern (GET-Request) und den empfangenen Inhalt mit innerHTML in eine Javascript-Variable zu lesen.

            Alles andere ist im Verhalten identisch.

            - Sven Rautenberg

            --
            My sssignature, my preciousssss!
  2. Hallöle,

    also Ajax scheint für mein Problem nicht die Lösung zu sein.

    Wie kann ich erreichen, dass ein Programm neue Daten anzeigt, wenn sich diese Daten geändert haben?

    Wie macht es eigentlich ein Chatprogramm, das einen neuen Beitrag sofort nach dem Absenden anzeigt? Manchmal passiert doch minutenlang nichts.

    Kalle

    1. Moin!

      Wie kann ich erreichen, dass ein Programm neue Daten anzeigt, wenn sich diese Daten geändert haben?

      Nimm was anderes als HTTP als Protokoll - was gleichbedeutend ist mit: Versuche es nicht mit einem handelsüblichen Browser.

      Wie macht es eigentlich ein Chatprogramm, das einen neuen Beitrag sofort nach dem Absenden anzeigt? Manchmal passiert doch minutenlang nichts.

      Ein HTTP-Chat hat genau dasselbe Problem und löst es durch ständiges Neuladen vom Server.

      Andere Chatprotokolle wie z.B. IRC haben das Problem nicht, weil da eine bidirektionale, dauerhafte Verbindung aufgebaut wird, die von jeder Seite aus zu jeder Zeit Informationen an die Gegenstelle schicken kann. Das Clientprogramm zeigt hereinkommende Chat-Statements dann direkt im Anzeigebereich an.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. hallo, Sven,

        letzte Frage, dann ist dieses Thema durch:

        Gibt es ein per JavaScript erkennbares Ereignis, das den Fokus einer Seite anzeigt?

        Also das Gegenstück zu

        <script type="text/javascript">self.focus();</script>

        Wenn nach Bearbeitung eines Programms die vorherige Seite (Liste) wieder in den Vordergrund kommt, wäre der richtige Moment, meine Abfrage zu starten.

        Kalle

        1. Moin!

          Gibt es ein per JavaScript erkennbares Ereignis, das den Fokus einer Seite anzeigt?

          Was hälst du von onfocus?

          Ist als HTML-Attribut nicht unbedingt überall erlaubt, aber darf per Javascript praktisch überallhin zugewiesen werden (auf dieselbe Art konnte man z.B. dem Netscape 4 onmouseover/out außerhalb von Links beibringen).

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
      2. Moin!

        Wie macht es eigentlich ein Chatprogramm, das einen neuen Beitrag sofort nach dem Absenden anzeigt? Manchmal passiert doch minutenlang nichts.

        Ein HTTP-Chat hat genau dasselbe Problem und löst es durch ständiges Neuladen vom Server.

        Die Frage ist was neu geladen wird. Gängige böse[tm] Lösungen holen nur eine Zahl ab. Hat sich diese verändert wird alles ab Zeile X nachgeladen, oder eben 100 Zeilen Textdatei. Beim Absenden einer eigenen Zeile eben auch.

        Andere Chatprotokolle wie z.B. IRC haben das Problem nicht, weil da eine bidirektionale, dauerhafte Verbindung aufgebaut wird, die von jeder Seite aus zu jeder Zeit Informationen an die Gegenstelle schicken kann. Das Clientprogramm zeigt hereinkommende Chat-Statements dann direkt im Anzeigebereich an.

        Die sind ohne Zweifel die bessere Lösung.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development