Gustl: + ajax + perl

hi, wieso aktualisiert sich der timewert nicht? meiner logik nach stupst jeder request das test.cgi neu an um zu liefern, oder nicht?

<html><head><title>so ein glump</title>

<script type="text/javascript">  
  
    var AJAX = new XMLHttpRequest();  
  
    function MACH1(url) {  
        AJAX = new XMLHttpRequest();  
        AJAX.open('GET', url, true);  
        AJAX.onreadystatechange = liefern;  
        AJAX.send(null);  
    }  
	  
    function MACH2(url) {  
        AJAX = new XMLHttpRequest();  
        AJAX.open('GET', url, true);  
        AJAX.onreadystatechange = liefern;  
        AJAX.send(null);  
    }  
  
   function liefern() {  
        if (AJAX.readyState == 4) {  
          var wasdas = AJAX.responseText;  
          document.getElementById("kuckmal").innerHTML = wasdas;  
        }  
   }  
	  
  setInterval("MACH1('test.cgi')",1000);  
  setInterval("MACH2('test.cgi?do=wasanderes')",1500);  
  
</script>
</head><body>  
  
<span style="cursor: pointer; text-decoration: underline" onclick="MACH2('test.cgi?do=wasanderes')">  
Mach das mal bitte</span><br><br><div id="kuckmal"></div>  
  
</body></html>

einfaches test.cgi:

#!/usr/bin/perl  
  
use CGI qw/:standard/;  
use strict;  
use CGI::Carp "fatalsToBrowser";  
  
my $do=param("do");  
  
print header('text/html');  
  
if (!$do) {  
  my $data=time(); print $data;  
} else {  
  my $data="machanderes"; print $data;  
}
  • Gustl
  1. ich hab das problem nur im IE (hab vers. 8 drauf). firefox und chrome z.b., die machens richtig. es müsste aber auch auf IE laufen ...

      
    if (window.XMLHttpRequest) { // Mozilla, Safari,...  
      http_request = new XMLHttpRequest();  
      } else if (window.ActiveXObject) { // IE  
        try {  
        http_request = new ActiveXObject(\"Msxml2.XMLHTTP\");  
       } catch (e) {  
         try {  
         http_request = new ActiveXObject(\"Microsoft.XMLHTTP\");  
         } catch (e) {}  
      }  
    }  
      
    if (!http_request) {  
      alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');  
      return false;  
    }
    

    schafft keine abhilfe

    • Gustl
    1. ich hab das problem nur im IE (hab vers. 8 drauf). firefox und chrome z.b., die machens richtig. es müsste aber auch auf IE laufen ...

      Was sagt die Fehlerkonsole?

      schafft keine abhilfe

      Was zum einen an den Syntax-Fehlern liegt, zum anderen ist das Shim für IE Versionen kleiner als 7 gedacht. Ab IE7 wird das XMLHttpRequest-Obekt unterstützt.

      1. Was sagt die Fehlerkonsole?

        du meinst ob JS-fehler auflaufen? nein.

        Ab IE7 wird das XMLHttpRequest-Obekt unterstützt.

        dachte ich mir schon, sonst wäre schon mit obigem code vom eingangsthread ein fehler aufgelaufen.

        aber wo ist der unterschied? wieso aktualisiert nur der IE nicht und was kann ich dagegen machen?

        • Gustl
        1. beim IE funktioniert das "anstupsen" des scripts nicht. der stuptst das einmal an, lädt was zurückkommt in den cache und das wars dann. das cript wird nicht nochmal ausgeführt. nicht mal wenn man mit strg+f5 die seite neu lädt oder in den header no-cache schreibt.

          was ist das für ein mist. mich ärgert jetzt ein wenig dass anscheinend hier welche die lösung in der tasche haben, sie aber nicht mit mir teilen wollen. ist denn diese lösung so wertvoll?

          ich kann vielleicht nicht viel zum forum beitragen, weil ich vom wissensstand unter den meisten hier liege. aber dafür ist das forum doch da, dass die klügeren den dümmeren helfen. dachte ich jedenfalls.

          ich lass das jetzt hier vorerst, sonst muss ich mich noch richtig ärgern. also bis später mal.

          • Gustl
          1. Hallo,

            beim IE funktioniert das "anstupsen" des scripts nicht. der stuptst das einmal an, lädt was zurückkommt in den cache und das wars dann. das cript wird nicht nochmal ausgeführt.

            halt stop, hier melde ich Zweifel an: Wird das Script (du meinst das Javascript, oder?) tatsächlich nicht erneut ausgeführt, oder wird bloß kein neuer Request an den Server abgesetzt?

            Es ist ein häufiges Problem, dass der IE in der Defaulteinstellung sehr "aggressiv" cacht - also Daten, die er einmal im Cache hat, für lange Zeit gar nicht mehr anfordert. Eine probate Lösung ist, der Request-URL einen zusätzlichen Parameter anzuhängen, der sich bei jedem Request ändert (z.B. einen Zähler oder einen Zufallswert). Der kann serverseitig ruhig ignoriert werden; entscheidend ist, dass es sich für den IE damit nicht um dieselbe URL handelt und er deshalb nicht in Versuchung kommt, auf den Cache-Inhalt zuzugreifen.

            mich ärgert jetzt ein wenig dass anscheinend hier welche die lösung in der tasche haben, sie aber nicht mit mir teilen wollen.

            Das glaube ich eher nicht; ich habe eher den Eindruck, dass deine Problembeschreibung einigen zu unklar ist. Ich habe gerade eben auch nur geraten.

            aber dafür ist das forum doch da, dass die klügeren den dümmeren helfen. dachte ich jedenfalls.

            So soll es eigentlich sein. Und im Idealfall lernen die Klügeren dabei auch noch.

            Ciao,
             Martin

            --
            Der Klügere gibt so lange nach, bis er mal der Dumme ist.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. hi martin. so, ich hab jetzt meinen lambo 2 stunden lang auf der autobahn verheizt und meinen frust abgebaut. danach kaffee und kuchen .. jetz sein besser :-)

              beim IE funktioniert das "anstupsen" des scripts nicht.

              (du meinst das Javascript, oder?)

              ne, das externe programm (bei mir das test.cgi, das später mal datenänderungen auslesen und datenänderungen vornehmen wird).

              Es ist ein häufiges Problem, dass der IE in der Defaulteinstellung sehr "aggressiv" cacht ... Eine probate Lösung ist, der Request-URL einen zusätzlichen Parameter anzuhängen, der sich bei jedem Request ändert (z.B. einen Zähler oder einen Zufallswert). Der kann serverseitig ruhig ignoriert werden

              genau das hab ich auch grade rausbekommen. ich find das ziemlich fies, da drauf musste meine katze erst mal kommen!

              in der Defaulteinstellung

              eben genau damit muss es aber funzen. "stellen sie ihren IE erst mal vernünftig ein bevor sie sich einbilden auf meiner seite rummachen zu können. oder verwenden sie nen anderen browser, damit können sie sich ärger ersparen."

              solche sachen kommen aber bei opagandalfs mitte 40 style nicht gut an. die leute sagen, dann lass ichs halt, das glump geht ja nicht. mich selbst ärgert das (muss ich ehrlich gestehen) auch. wenn eine seite auf der ich surfe zoff macht, oder es schon heisst "verwenden sie bitte nur browser blabla" bin ich sofort weg davon.

              ALSO: ich hab ne protokolldatei mitschreiben lassen, wann das CGIscript ausgeführt wird. es ist tatsächlich so, dass das CGIscript, das die geänderten daten liefern soll, GAR NICHT ausgeführt wird, so lange sich nicht der übergabeparameter ändert.

              was ist das für eine IE logik? man kann also nicht einfach sagen, kuck ob neue daten da sind und aktualisiere damit meinen bildschirm .. ne, man muss erst die url ändern. dann kann ich auf ajax ja gleich verzichten.

              mich ärgert jetzt ein wenig ...

              damit war nur einer gemeint. egal, verflogen, wen interessierts.

              • Gustl
              1. was ist das für eine IE logik?

                Das hat in dem Fall ausnahmsweise mal nichts mit dem IE zu tun, sondern ist Serversache. Cache-Control-Header gesetzt?

                1. was ist das für eine IE logik?

                  Das hat in dem Fall ausnahmsweise mal nichts mit dem IE zu tun, sondern ist Serversache. Cache-Control-Header gesetzt?

                  du meinst:

                  ... nicht mal wenn man [..] in den header no-cache schreibt...

                  in welchen header? in die html-datei, die JS ausführt oder in den header des cgi´s? (siehe eingansthread). zweiteres ist unlogisch, oder? denn das cgi wird mit IE ja nicht mal ausgeführt.

                  es kann doch eigentlich keine serversache sein wenns die anderen browser können. so denke ich mir. zumindest firefox und chrome, andere hab ich nicht.

                  irgendwie muss es wohl mit ajax zu tun haben, wie der IE mit dem xmlhttprequest umgeht. ich kann da nur rätseln. wenn sich die url ändert wird der request ausgeführt, ansonsten nicht. ein reiner austausch der werte reicht auch nicht, es muss jedesmal ein komplett neuer wert sein, den der IE, solenge er offen ist noch nicht verwendet hat. ich kanns nur nochmal wiederholen, die anderen browser haben dieses problem nicht.

                  ICH GLAUBE DIE VERBINDUNG MIT AJAX FÜHRT UNS ALLE AN DER NASE RUM. wer weiss denn, was genau die browser mit dem xmlhttprequest machen? ich jedenfalls weiss es nicht.

                  klar, den trick dass man z.b. den unix-zeitwert an die url anhängt und den wert einfach serverseitig ignoriert kann man anwenden. somit ist zumindest sichergestellt dass der anwender jede sekunde einen klick machen kann und daraufhin die neuen daten geliefert bekommt. hängt man an den zeitwertstring dann noch eine zufallszahl, wird sich dieser wert wohl nie wiederholen.

                  aber das ist keine saubere sache. das ist nur getrickst.

                  man stelle sich jetzt mal vor, der anwender hat einen bildschirm vor sich mit 150 verschiedenen aktienkursen die er per mausklick überwachen will.

                  aktueller kurs aktie 1<
                  aktueller kurs aktie 2<

                  ...

                  aktueller kurs aktie 150<

                  usw.

                  dann brauche ich für jeden link sowieso eine id der aktie und dazu noch einen riesig langen eindeutigen wert aus unix-zeitwert und einer zufallszahl. dann ein div mit noch einer id, in dem der aktuelle wert ausgetauscht wird ... weiter hab ich noch gar nicht gedacht.

                  alleine der quellcode der erstmals zu laden ist hat dann .. 5 MB oder so?

                  naja, wenns nicht anders geht muss es halt so sein.

                  • Gustl
                  1. Hallo,

                    ... nicht mal wenn man [..] in den header no-cache schreibt...
                    in welchen header? in die html-datei, die JS ausführt oder in den header des cgi´s? (siehe eingansthread). zweiteres ist unlogisch, oder? denn das cgi wird mit IE ja nicht mal ausgeführt.

                    das ist alles andere als unlogisch, denn irgendwann wird die Ressource ja ein erstes Mal angefragt. Wenn dann in den HTTP-Headern Caching-Empfehlungen übermittelt werden, gelten die natürlich für weitere Anfragen derselben Ressource. Wenn ich beim ersten Mal eintrage, "Gilt nur für 30s", dann sollte ein Browser die Ressource neu anfordern, wenn seit dem letzten Mal mehr als 30s vergangen sind.
                    Naja, "sollte". Erzwingen kann man es dennoch nicht.

                    es kann doch eigentlich keine serversache sein wenns die anderen browser können. so denke ich mir. zumindest firefox und chrome, andere hab ich nicht.

                    Doch, es liegt sehr wohl am Browser. Und zwar weil jeder Browser die "Gültigkeit" dessen, was er im Cache hat, anders beurteilen könnte - sofern der Server dazu keine Angaben macht (was du hier anscheinend nicht tust). Daher ja mein Tipp mit dem Dummy-Parameter, weil der IE halt einen Tritt in den Hintern braucht - und bei den anderen Browsern schadet's zumindest auch nicht.

                    irgendwie muss es wohl mit ajax zu tun haben, wie der IE mit dem xmlhttprequest umgeht. ich kann da nur rätseln. wenn sich die url ändert wird der request ausgeführt, ansonsten nicht. ein reiner austausch der werte reicht auch nicht

                    Hä? Das klingt irgendwie falsch. Ein Austausch der Werte (also der URL-Parameter) _ist_ doch eine Änderung der URL.

                    es muss jedesmal ein komplett neuer wert sein, den der IE, solenge er offen ist noch nicht verwendet hat.

                    Ach so, du meinst, zwei verschiedene Parameterwerte im Wechsel? Ja klar, dann "erinnert" sich der IE bei jedem zweiten Request: "Kenn ich schon, hab ich schon."

                    ICH GLAUBE DIE VERBINDUNG MIT AJAX FÜHRT UNS ALLE AN DER NASE RUM. wer weiss denn, was genau die browser mit dem xmlhttprequest machen?

                    Genau dasselbe wie mit einem ganz "normal" verlinkten HTML-Dokument. Wenn du zwei- oder dreimal hintereinander dieselbe Seite aufrufst, fordert der IE sie auch nicht jedesmal neu an - das tut er oft nicht einmal beim "Reload" mit der F5-Taste. Da braucht's oft schon den erzwungenen Reload mit Shift-F5.

                    aber das ist keine saubere sache. das ist nur getrickst.

                    Natürlich, da bin ich ganz deiner Meinung. Besser wäre ein browserseitig vernünftig eingestelltes Caching. Aber das ist Benutzersache, darauf haben wir keinen Einfluss.

                    man stelle sich jetzt mal vor, der anwender hat einen bildschirm vor sich mit 150 verschiedenen aktienkursen die er per mausklick überwachen will.

                    Dann ist eine Webseite wohl der falsche Weg dafür. Oder aber man lässt sich die komplette Liste aller gewünschten Werte serverseitig jeweils auf Anfrage aktuell generieren und überträgt sie komplett, denn 150 Einzel-Requests wären sowieso Horror.

                    alleine der quellcode der erstmals zu laden ist hat dann .. 5 MB oder so?

                    Nö, keine Spur. Wenn du für den Austausch bestimmter Informationen sowieso auf Javascript setzt, kann auch ein Großteil des Dokuments dynamisch mit Javacript aufgebaut werden. Dieser Fall wäre prädestiniert für die Verwendung einer Schleife, die eine lange Liste oder Tabelle aus lauter gleichartig aufgebauten Einträgen erzeugt. Die gewünschten Info-IDs entweder in einem Array, oder benutzerspezifisch als separate dynamisch generierte Script-Ressource (damit jeder Nutzer seine ganz eigene Zusammenstellung von Akten haben kann). Das geht in weniger als 5k.

                    So long,
                     Martin

                    --
                    F: Wer waren die ersten modernen Politiker?
                    A: Die Heiligen drei Könige. Sie legten die Arbeit nieder, zogen teure Klamotten an und gingen auf Reisen.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(