Ankündigung

Einklappen
Keine Ankündigung bisher.

funktion dynamisch

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • funktion dynamisch

    hallo, ich habe eine Ajax Anwendung, der ich aus php einen Funktionsaufruf übergeben möchte.
    ich stelle also Variablen zusammen, die ich in Javascript auslese und als Funktion zusammenstelle

    in Javascript kommt dann an:
    var dataAll als Array

    das enthält

    dataAll[0] -> Hinweis, das ist eine Funktion
    dataAll[1] -> Funktionsname
    dataAll[2] -> Parameter durch Komma getrennt

    dann der start
    var temp = dataAll[i][2].split(",");
    if(typeof window[dataAll[i][1]] == 'function') {window[dataAll[i][1]](temp[0], temp[1], temp[2]);}

    das funktioniert.
    Nun ist es aber so, das dieser Aufruf nur mit 3 Parametern funktioniert.
    Wenn ich nun aber zum Beispiel eine Funktion aufrufe, der ich 5 Parameter übergebe, muss ich den Aufruf eben mit 5 Parametern schreiben, also
    if(typeof window[dataAll[i][1]] == 'function') {window[dataAll[i][1]](temp[0], temp[1], temp[2], temp[3], temp[4]);}

    Das würde ich gern dynamisch lösen, also mit einer Schleife. Aber genau da hänge ich fest. Wie mache ich das?


  • #2
    Wie mache ich das?
    Nicht mit einer Schleife: https://developer.mozilla.org/de/doc...Function/apply

    Außerdem würde ich kein Array, sondern ein Objekt nehmen, das ist im Code deutlich verständlicher. Und mit JSON als Übertragungsformat brauchst du auch kein split().

    z.B.
    Code:
    // JSON
    {
      "name": "doSomething",
      "args": ["foo", "bar"]
    }
    
    if (typeof window[obj.name] === 'function') {
        window[obj.name].apply(null, obj.args)
    }

    Kommentar


    • #3
      Globale Funktionen sind übrigens böse. Du solltest den globalen Namensraum (window) nicht mit Funktionen zumüllen.

      Desweitern sollte PHP keine JavaScript-Funktionen aufrufen. PHP weiß nichts von JavaScript, da dies clientseitig läuft. Du solltest eher eine API in PHP schreiben, die mit JavaScript angesprochen werden kann. Anhand des HTTP-Responses kann dann JavaScript entscheiden, was zu tun ist. PHP sollte hier keine Macht darüber haben und auch nichts davon wissen. Durch so eine Koppelung schaffst du dir nämlich nur unnötige Abhängigkeiten ohne Vorteile.

      Kommentar


      • #4
        Zitat von Dormilich Beitrag anzeigen
        Nicht mit einer Schleife: https://developer.mozilla.org/de/doc...Function/apply

        Außerdem würde ich kein Array, sondern ein Objekt nehmen, das ist im Code deutlich verständlicher. Und mit JSON als Übertragungsformat brauchst du auch kein split().

        z.B.
        Code:
        // JSON
        {
        "name": "doSomething",
        "args": ["foo", "bar"]
        }
        
        if (typeof window[obj.name] === 'function') {
        window[obj.name].apply(null, obj.args)
        }
        Danke, das werde ich mal ausprobieren.

        Kommentar


        • #5
          Ich finde das was hellbringer gesagt hat, solltest du unbedingt umsetzen und dich auch für dessen tolle Hinweise bedanken, aber wahrscheinlich ist das mal wieder in Luft erzählt und wird wider besseren Wissens ignoriert.
          Dann also bis zum nächsten Problem. Bist ja nur schon 6 Jahre dabei.

          Kommentar


          • #6
            Zitat von protestix Beitrag anzeigen
            Ich finde das was hellbringer gesagt hat, solltest du unbedingt umsetzen und dich auch für dessen tolle Hinweise bedanken, aber wahrscheinlich ist das mal wieder in Luft erzählt und wird wider besseren Wissens ignoriert.
            Dann also bis zum nächsten Problem. Bist ja nur schon 6 Jahre dabei.
            Ich habe eine komplexe Ajax Anwendung. Diese wird wiederum innerhalb einer Website aufgerufen. Nach dem Aufruf läuft die quasi erst mal autark. Es gibt aber Daten, die müssen von der DB nachgeladen werden. Das macht dann wieder Javascript über den XHTML Request und PHP. Beides weiß voneinander nichts. Das ist schon getrennt. Es gibt aber Situationen, in denen Ajax einen Request absendet, PHP diesen bearbeitet, das Ergebnis zurückgibt und dann aber nach der Anzeige im Browser noch eine Aktion stattfinden muss. Da hatte ich erst für jede Aktion eine Funktion, sind eh nur zwei, und da hat dann die Rückgabe vom PHP quasi dem Javascript über eine Variable mitgeteilt, dass diese Funktion noch aufgerufen werden muss. Ich fand es einfach schöner, diese Funktion aus PHP mitgeben zu können, da dort alle dazu nötigen Variablen vorhanden sind. Javascript führt dann diese Funktion aus, egal was die macht. Mir erschien das sinnvoll. Wenn das nicht sinnvoll ist, aus welchen Gründen auch immer, dann ist das sicher einen Hinweis wert, für den ich auch dankbar bin. Nur nutzt es mir eben gar nichts, wenn ich nur eine Oberlehrer-Belehrung erhalte, aber keine Lösung. Hellbringer hat ja Recht, nur danach habe ich gar nicht gefragt. Warum schreibt er denn nicht so etwas wie Dormilich und ergänzt das um seinen Beitrag. Das wäre eine gute Antwort gewesen. Vor allem, weil er auch sicher genau das weiß, was Dormilich geschrieben hat. Ich kann diese Vorgehensweise nicht nachvollziehen. Da kann er auch gleich schreiben, ich will Dir nicht helfen, Du bist eh zu blöd um das richtig zu machen. Genau das schreibst Du ja auch. Für Dich ist auch vergebene Liebesmüh, mir zu helfen, weil ich eben nicht dauernd auf Knieen dem Genie huldige. Und genau dafür sehe ich keine Anlass für ein Danke.

            Kommentar


            • #7
              Mir erschien das sinnvoll. Wenn das nicht sinnvoll ist, aus welchen Gründen auch immer, dann ist das sicher einen Hinweis wert, für den ich auch dankbar bin. Nur nutzt es mir eben gar nichts, wenn ich nur eine Oberlehrer-Belehrung erhalte, aber keine Lösung.
              (..)
              Für Dich ist auch vergebene Liebesmüh, mir zu helfen, weil ich eben nicht dauernd auf Knieen dem Genie huldige. Und genau dafür sehe ich keine Anlass für ein Danke.
              ja, zum Nachdenken anregen ist nicht mehr so zeitgemäs. jetzt wird man schon de Art angegangen.
              Nach sechs Jahren keine Code Tags kennen, was will man da für ein Lernwille was für eine soziale Einstellung erwarten.

              Der Client muss wissen was nach einem Request passiert nicht der Server, der liefert nur Daten. So einfach ist das.

              Kommentar


              • #8
                Genauso habe ich mir das gedacht. Wieso muss man immer den Krösus raushängen lassen? Wenn Dich jemand nach der Uhrzeit fragt, und Du ihm die Zeitverschiebung zu Alaska erklärst, wird er Dich auch komisch ansehen. Was ist denn so schwer daran, die Sache auch mal aus dem Blickwinkel derer zu sehen, die nicht solche Genies sind? Wenn Du meinst, meine Frage ist unsinnig, weil der Ansatz vollkommen fasch ist, dann ist das Deine Meinung. Die darfst Du haben und die sollst Du gern auch kund tun. Trotzdem kann es doch sein, das der Fragesteller eben genau diesen Weg gewählt hat weil er es so wollte, nicht besser wusste, oder warum auch immer. Da ist es doch nun wirklich kein Thema, diesen Ansatz weiter zu verfolgen. So kommt der Fragesteller zumindest zu einer Lösung. Dann kann man doch immer noch darauf hinweisen, dass der Ansatz falsch oder fehleranfällig ist. Ist eine Lösung mit dem Weg des Fragestellers gar nicht möglich, ist das natürlich etwas anderes. Nur bei mir gibt es ja eine Lösung. Ob die nun schön, sinnvoll und Dir genehm ist, tut doch da gar nichts zur Sache. Wieso muss das immer so ausarten. Ich kann das gar nicht oft genug sagen, Ihr seid doch auch nicht als Genies auf die Welt gekommen. Ich nehme gern jeden Rat an. Manchmal muss ich aber auch erst mal meinen Weg weiter verfolgen, weil die Umstellung auf den anderen Zeit kosten würde, die ich grad nicht habe. Ich finde daran nichts schlimmes und ich stelle weder Euer wissen noch Euren guten Willen in Frage. Solltest Du dennoch der Meinung sein, das Du den falschen Ansatz nicht auch noch unterstützen willst, dann kannst Du das doch auch sagen. Aber immer sollte es darauf hinauslaufen, das der Antwortende zumindest eine Ansatz zeigt und dann den Hinweis auf Fehler oder bessere Lösungen bringen. Die Tatsache, dass der globale namensraum frei bleiben sollte, bedeutet doch nicht, das es immer falsch ist, den zu benutzen. Sonst wäre die Möglichkeit doch gar nicht erst da. Aber genau diese Vorgehensweise würde bei mir zum Erfolg führen. OK, die Programmierung an sich ist dann verbesserungswürdig, aber trotzdem funktioniert es erst mal. Nun kann man das gerne verbessern. Das Problem ist nicht die mir unterstellte Beratungsresistenz, die nie da war und nie da sein wird, sondern die Überheblichkeit derer, die auf Fehler oder Fehlerquellen hinweisen. Also die "wissenden". Wenn man mir sagt, "Du bist eh zu blöd", und nichts anderes war der Post, braucht man nicht auch noch Dank zu erwarten. Und wieder hätte man mit der Antwort eines einzigen, nämlich von Dormilich, diesen ganzen Thread bereits längst beenden können. Und man hätte sich viel Ärger erspart. Und ein Danke hätte, bzw. hat, es ja auch noch gegeben. Schönes WE noch und werdet doch einfach mal etwas lockerer

                Kommentar


                • #9
                  Einen Absatz über ca. 30 Zeilen und du glaubst das liest jemand? Da landet doch bei 99% aller Leute sofort auf /dev/null wegen TLDR.

                  Ohne den Monsterblock gelesen zu haben (das tu ich mir wirklich nicht an, sorry), bin ich mir ziemlich sicher, dass du auf dem Holzweg bist und Symptome behandelst statt die tatsächliche Aufgabe zu lösen.

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen
                    Einen Absatz über ca. 30 Zeilen und du glaubst das liest jemand? Da landet doch bei 99% aller Leute sofort auf /dev/null wegen TLDR.

                    Ohne den Monsterblock gelesen zu haben (das tu ich mir wirklich nicht an, sorry), bin ich mir ziemlich sicher, dass du auf dem Holzweg bist und Symptome behandelst statt die tatsächliche Aufgabe zu lösen.
                    Das ist doch kein Problem. Wenn ich Deiner Meinung nach auf dem Holzweg bin, das ist das wahrscheinlich auch so. Das ändert aber nichts an der Tatsache, dass ich mir dabei auch etwas gedacht hatte. Wahrscheinlich falsch, ok. auch kein Problem. Aber deswegen bin ich noch lange kein Idiot, dem an von oben herab sagen kann, Du bist halt eben nur ein Idiot. Und nichts anderes hast Du in Deinem ersten Post gesagt, auch wenn Du es in viele andere Worte gepackt hast.

                    Kommentar


                    • #11
                      Zitat von psygonis Beitrag anzeigen
                      Das ist doch kein Problem. Wenn ich Deiner Meinung nach auf dem Holzweg bin, das ist das wahrscheinlich auch so. Das ändert aber nichts an der Tatsache, dass ich mir dabei auch etwas gedacht hatte. Wahrscheinlich falsch, ok. auch kein Problem. Aber deswegen bin ich noch lange kein Idiot, dem an von oben herab sagen kann, Du bist halt eben nur ein Idiot. Und nichts anderes hast Du in Deinem ersten Post gesagt, auch wenn Du es in viele andere Worte gepackt hast.
                      Nein, überhaupt nicht. Ich habe nur Fakten aufgelistet. Was du da rein interpretierst ist deine Sache und passiert nur in deinem Kopf.

                      Kommentar


                      • #12
                        psygonis

                        was Du suchst nennt sich Spread-Operator...

                        HTML-Code:
                        <!doctype html>
                        <html lang="de">
                          <meta charset="UTF-8">
                          <title>test</title>
                          <script>
                           myFunc = "myTest"
                           myPar = '2,3,4,5'.split(",")
                           myTest = (p1,p2,p3,p4) => p1*p2*p3*p4
                           console.log(window[myFunc](...myPar)); 
                          </script>

                        Kommentar


                        • #13
                          Zitat von kaminbausatz Beitrag anzeigen
                          psygonis

                          was Du suchst nennt sich Spread-Operator...

                          HTML-Code:
                          <!doctype html>
                          <html lang="de">
                          <meta charset="UTF-8">
                          <title>test</title>
                          <script>
                          myFunc = "myTest"
                          myPar = '2,3,4,5'.split(",")
                          myTest = (p1,p2,p3,p4) => p1*p2*p3*p4
                          console.log(window[myFunc](...myPar));
                          </script>
                          Danke, auch das werde ich mal einbauen. Auf jeden Fall habe ich da jetzt wieder genug zu testen. Danke, nochmal.

                          Kommentar

                          Lädt...
                          X