Announcement

Collapse
No announcement yet.

Reihenfolge der Abarbeitung der Funktionen forcieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Reihenfolge der Abarbeitung der Funktionen forcieren

    Hallo zusammen!

    Ich habe folgendes Problem: Ein <div> Element wird geklickt - dann beginnt ein Arbeitsprozess der je nach der Anzahl der Datensätze die in der Datenbank bearbeitet werden, bis zu 30 Sek. dauern kann. Da jeder weitere Klick eines ungeduldigen Users während der 30 Sek. das ganze erneut starten würde, möchte ich das <div> zuerst ausblenden, ein anderes einblenden und mich dann erst mit der Datenbank vergnügen. Ich hatte mir das etwa so gedacht:

    Code:
    function start() {
       felder_anzeigen();
       uebertrag_kostentraeger_folgejahr();
    }
    function felder_anzeigen() {
       document.getElementById("run").style.display = "none";
       document.getElementById("uebertrag").style.display = "";
    }
    function uebertrag_kostentraeger_folgejahr() {
       // Zuerst werden die Kostenträger für alle Kunden auf die der Mitarbeiter Zugriff hat, auf das Folgejahr übertragen (es werden ALLE Kostenträger übertragen, nicht nur die, bei welchen Budgets angelegt sind)
       var jahr_von = document.getElementById("jahr_von").value;
       var jahr_bis = document.getElementById("jahr_bis").value;
       mein_link = "AJAX_REQUESTS.php?aktion=uebertrag_kostentraeger_folgejahr&jahr_von=" + jahr_von + "&jahr_bis=" + jahr_bis;
       console.log(mein_link);
       resOb = erzXHRObjekt();
       resOb.open('get', mein_link, false);
       resOb.onreadystatechange = uebertrag_budgets_folgejahr;
       resOb.send(null);
    }
    
    function uebertrag_budgets_folgejahr() {
       // richtig viel Code...
    }
    In der Funktion felder_anzeigen() soll das unerwünschte <div> aus- und das gewünschte eingeblendet werden, dann sollte erst in der Funktion uebertrag_kostentraeger_folgejahr() per AJAX die Datenbank angesprochen werden. Stattdessen wird aber zuerst die DB angesprochen (siehtr man eindeutig an den Ausgaben in der Konsole - und erst nachdem die Arbeit in der Datenbank beendet ist, geschieht das, was in felder_anzeigen() beschrieben ist.

    Aus welchem Grund auch immer JS sich die Funktion felder_anzeigen() bis zum Ende aufhebt - für den Benutzer ist es ziemlich blöd, wenn er den Eindruck hat, dass sein Klick nichts bewirkt hätte. Es muss doch irgendwie möglich sein, zuerst das soeben angeklickte <div> Element auszublenden und dann erst weiterzumachen? Bin sehr gespannt auf eure Beiträge und danke im Voraus!


  • #2
    Würde mal als erste Zeile in jeder Funktion ein alert setzen, ob tatsächlich die 2. Funktion als erstes abgearbeitet wird. Ich kann das nicht glauben. Was in der Konsole steht muss so nicht stimmen, weil
    - felder_anzeigen direkt nichts ins Log schreibt
    - der Browser ev. nachhinkt mit der Aktualisierung der Seite, und die DB-Anfrage tatsächlich als 2. ausgeführt wird.
    Christian

    Comment


    • #3
      Du hast vollkommen Recht! Es wird tatsächlich zuerst das alert() aus der Funktion felder_anzeigen ausgeführt, nur sieht man den Effekt im Browser zunächst nicht. Hast du irgendeine Idee, wie man das Problem lösen könnte?
      Auf der PHP-Seite habe ich dafür gesorgt, dass Kostenträger etc. trotz mehrfachen Klickens nicht mehrfach eingetragen werden. Es ist aber optisch einfach nicht schön, wenn man irgendwo draufklickt und 30 Sek. erstmal nichts passiert (oder so scheint).

      Comment


      • #4
        Würde mit Eventhnadlern probieren, diesen beim Start der Seite dem Element anfügen, dann im felder_anzeigen diesen sofort entziehen und am Ende von uebertrag..wieder setzen
        https://api.jquery.com/category/even...er-attachment/
        Oder die Seite komplett mit einem Overlay abdecken, welches erst am Ende von uebertrag..wieder entfernt wird
        Christian

        Comment


        • #5
          Das "ungewünschte" <div>-Element reagiert jetzt nicht auf mehrmalige Klicks, aber es ist eben noch da - man klann es noch sehen. Egal was ich in felder_anzeigen() reinschreibe, was ich an CSS - Eigenschaften per JS oder jQiery ändern möchte, der Effekt wird erst sichtbar, nachdem die DB fertig ist. Deshalb funktioniert die Idee mit dem Overlay ebenso nicht, denn das Overlay müsste auch im richtigen Moment ein- und ausgeblendet werden.

          Ich habe folgendes Versucht:

          ich habe ein zusätzliches Inputfeld geschaffen (welches später versteckt sein wird). Es sollte durch die Funktion felder_anzeigen() eine "1" als Inhalt bekommen. Soweit so gut - dann habe ich versucht mit jQiery einen Eventhandelr zu finden, der dann auf diesen Eintrag hin die Funktion auslöst, die sich der DB widmet. So hatte ich die Hoffnung, dass erst nach der Ausführung aller grafischen Änderungen die Bearbeitung der DB anfängt. Das Problem dabei war jedoch, dass "oninput" nur reagiert hat, wenn ich manuell etwas in das entsprechende Feld reingeschrieben habe, nicht aber, wenn der Wert des Inputfelds durch document.getElementById("db_aktionen_starten").val ue = 1 reingeschrieben wurde.

          Comment


          • #6
            Ein <div> Element wird geklickt
            Warum ein DIV? Dafür gibt es doch Buttons, die kann man auch hübsch stylen.
            Der Vorteil für Dich ist dabei, dass Du den disablen kannst, solange der Prozess dauert.
            PHP rocks!
            Eine Initiative der PHP Community

            Comment


            • #7
              Versuch die 2. Funktion nach einem setTimeout aufzurufen
              Christian

              Comment


              • #8
                Button-Lösung:
                https://codepen.io/ArneDrews/pen/XWjoNEE
                und statt des setTimeout startest Du Dein Ajax und wartest auf Rückmeldung, bevor Du den Button wieder aktivierst.
                PHP rocks!
                Eine Initiative der PHP Community

                Comment

                Working...
                X