javascript: wann werden globale Variable "submitted"?

  • Hallo Zusammen!

    Ich sitze gerade bei einem Problem, und bin dadurch auf eine interessante Fragestellung gestossen: So wie es ausschaut, dürfte javascript die Änderungen, die innerhalb einer function gemacht werden, erst "submitten", wenn die Funktion zu Ende ist. D.h. bei folgendem Codeschnippsel:

    dass sich die Schriftfarbe des Elements mit der ID "content" erst 2sek später und nicht sofort ändert. Wie kann man das verhindern? Wie kann man diese Änderungen sofort "nach draussen flushen"?

    Wie kommt man auf so eine blöde Fragestellung? ;) Ich hab eine Funktion, die eine Änderung einer bestimmten Variable über ein IFrame an ein Servlet postet, damit falls sich die Variable ändert, das zwar in der Session gespeichert werden kann, aber nicht die ganze Seite neu geladen werden muss (es gibt noch einige andere Variablen).

    Die Funktion funktioniert soweit prächtig. Bis ... man auf die Idee kommt, den Button (oder die Buttons) sehr schnell hintereinander zu drücken (aber definitiv kein Doppelklick). Die Funktion wird dann zwar zwei Mal ausgeführt, aber das Formular im IFrame (Request an das Servlet) nur 1x abgeschickt.

    Jetzt hab ich mir gedacht, dass ich die Funktion synchronized mach. Das Wort "synchronized" ist zwar schon in JavaScript reserviert, nur ist damit leider keine Funktionalität verbunden. ;) Gut ... also selber eine Art synchronized machen. Kein Problem ... globale Variable "running". Sobald man in der Funktion drinnen ist, wird überprüft, ob running auf false ist. Falls ja, wartet man. Falls nein, setzt man sie auf false und führt den Rest. Würde ja alles superprächtig passen, wenn nicht die Änderung der globalen Variablen "running" nicht erst ganz am Ende der Funktion in die "Aussenwelt" geflusht wird. Womit ich wieder am Anfang der Geschichte angelangt wäre ...

    Hat jemand Ideen?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • servus,

    klingt seltsam, bzw ist mir noch nie aufgefallen obwohl ich auch schon mal sowas mit einer "running" variable gemacht hab - ist wohl nie der fall aufgetaucht.

    sofern ich das richtig verstanden habe könntest du das problem umgehen wenn du statt dem iframe AJAX verwenden würdest, ist einfach zum einsetzen. und da prüfst auch obs noch am laufen ist und da funktionierts. hier ein super einführung. bzw gibts auch die möglichkeit den ablauf synchron abzulaufen lassen (weiß aber nicht wie sich die sachen dabei verhalten).

    aber zu dem anderen problem kann ich leider nix sagen.

    mfg seHaas

  • Versteh ich nicht.. Du meinst du setzt irgendwo in deiner Funktion die globale Variable auf einen Wert und der ändert sich erst zu diesem Wert, wenn du aus der Funktion draussen bist? Wenn ich das so richtig verstanden hab, dann poste mal bitte diese Funktion, denn bei mir gibts so ein Problem nicht.

    btw.: Warum hast du in der do-while Schleife noch dieses "var"? Hast die Variable ja schon deklariert.

    640K ought to be enough for anybody. :eek2:

  • hab jetzt a wengal probiert, bei dem oben geschrieben code stimmts, wenn ich den inhalt eines textfeldes ändere gehts sofort, aber ich habs irgendwie nicht zusammengebracht das an einer globalen variable zu testen. wenn ich eine funktion schreibe die eine var ändert und dann a wait hat und eine zweite funktion die, die var ausgibt (textbox) - beide werden über einen link gestartet. jedenfalls wird die ausgabefunktion erst ausgeführt wenn die andere fertig ist.

    maciek: ich weiß zwar nicht warum das iframe nur einmal neu geladen wird, aber is in dem fall nicht eh egal, der zweite click war ja "unabsichtlich". bzw wann hättest du running wieder zurückgeändert?

  • Zitat von Swoncen

    Versteh ich nicht.. Du meinst du setzt irgendwo in deiner Funktion die globale Variable auf einen Wert und der ändert sich erst zu diesem Wert, wenn du aus der Funktion draussen bist? Wenn ich das so richtig verstanden hab, dann poste mal bitte diese Funktion, denn bei mir gibts so ein Problem nicht.


    für mal den Code aus. Die Farbe des Textes wird nicht sofort umgeändert, sondern erst nach 2sek. Wenn es bei Dir anders ist, dann würde es mich interessieren, was für eine Umgebung Du hast. Bei mir dauert es 2sek beim Mozilla und beim IE.

    Zitat von Swoncen

    btw.: Warum hast du in der do-while Schleife noch dieses "var"? Hast die Variable ja schon deklariert.


    die do-while Schleife ist ein copy & paste von irgendwo aus dem Internetz ;)

    Zitat von seHaas

    maciek: ich weiß zwar nicht warum das iframe nur einmal neu geladen wird, aber is in dem fall nicht eh egal, der zweite click war ja "unabsichtlich". bzw wann hättest du running wieder zurückgeändert?


    naja ... egal ist es nicht. Es ist zwar ziemlich unwahrscheinlich, dass jemand das tut, aber nix desto trotz. Vielleicht erklär ich mal kurz, was tiefere Sinn und Zweck der eigentlichen Funktion ist: Man hat eine Gruppe von Menüelementen. Neben der Gruppebezeichnung gibt es wie beim Windows Explorer dieses +/- Mit diesem kann man die Elemente über display:none bzw. display:block ein- bzw. ausblenden. Zusätzlich wird jeder Klick drauf auch an ein Servlet submitted, das den Zustand jeder Gruppe speichert. Damit soll gesichert werden, dass wenn jemand die Sichtbarkeit ändert, die Seite verlässt und wieder zurückkommt, der Zustand noch immer der gleiche ist, wie von ihm ausgewählt.

    Und deswegen ist es nicht wurscht: Wenn ich jetzt nämlich 2x hintereinander schnell klicke (und zwar muss es nicht die gleiche Gruppe sein, es können auch zwei sein), geht der zweite Request zum Speichern verloren. D.h. ich habe eine Inkonsistenz zwischen dem was javascript darstellt, und dem was in der Session gespeichert wird.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • d.h. Ihr habt keine Lösung für das Problem? Kommt schon ... das muss ja irgendwie lösbar sein ...

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Ok, ich hab folgendes festgestellt: Die Variable ändert sich sicher schon in der Funktion, nur komischerweise erfolgt das document.write erst nach dem wait. Ich weiß nicht ob das jetzt alles klärt..

    640K ought to be enough for anybody. :eek2:

  • nochmal zu der idee mit dem RUNNING, ist vllt nicht die schönste art aber es könnte funktionieren.
    es gibt eben diese globale variable RUNNING.
    die funktion prüft ob running passt oder nicht, passts dann wird sie anders gesetzt. die funktion arbeitet alles ab inkl. iframe ändern.
    das iframe, genauer gesagt das script dass du aufrufst hat ein "onLoad" attribut im body das eine funktion aufruft die sowas macht:

    HTML
    <script language="javascript" type="text/javascript">
    
    
    setready = function() {
        this.parent.RUNNING=0;
    }
    
    
    </script>

    eigentlich kanns gar nicht zu dem fall kommen dass RUNNING noch ok ist und die funktion 2 mal ausgeführt wird, da der 2. aufruf erst abgehandelt wird wenn die erste funktion schon fertig ist und somit das RUNNING nicht ok ist.

    ich hoffe ich hab das verständlich genug rübergebracht. hab sowas vor ca 4 jahren schon gemacht und da gings ohne probleme. bzw wie schon in meinem ersten post geschrieben geht das ganze mit ajax eleganter :thumb:


    /edit: das quick replay vom forum scheint auch schon per ajax zu funktionieren ;)
    mfg seHaas

  • Also wie ich es dreh und wende: Beim zweiten Klick unmittelbar hintereinander kommt es nicht dazu, dass das alert("waiting ...") getriggert wird. Bedeutet für mich, dass die globale Variable nicht gesetzt wird.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • naja eigentlich ist das klar, weil auch wenn du 2mal kurz hintereinander clickst wird die funktion erst einmal abgearbeitet und erst wenn die fertig ist wirds ein zweites mal aufgerufen. bei mir zumindest wird das NICHT parallel gehandelt und somit kann er gar nicht in die schleife rein, weil ja am ende der funktion das running eh wieder auf false gesetzt wird.

  • Zitat von seHaas

    naja eigentlich ist das klar, weil auch wenn du 2mal kurz hintereinander clickst wird die funktion erst einmal abgearbeitet und erst wenn die fertig ist wirds ein zweites mal aufgerufen. bei mir zumindest wird das NICHT parallel gehandelt und somit kann er gar nicht in die schleife rein, weil ja am ende der funktion das running eh wieder auf false gesetzt wird.


    tja ... nur wenn das wirklich parallel abgearbeitet wird: Wieso geht dann ein Submit an den Server verloren bzw. wieso unterschlägt der Apache einen Response? Oder ist es das IFrame, das nicht reagiert, weil es was Anderes tut? Irgendwas stimmt da einfach nicht ...

    *** Make it idiot proof, and someone will build a better idiot. ***

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!