ingo b: function an document hängen

Hallo,

ich hatte schon mal gefragt, aber da der Thread im Archiv hängt und das auch nicht geklappt hat, frage ich jetzt nochmals:

Ich habe eine Art Editor für JS geschrieben. Dabei werden Funktionen als Objekt gehalten, d.h. ich habe den Funktionsnamen, eine Parameterliste und den Funktionscode.

Dann öffne ich ein neues Fenster und möchte die Funktion in das neue Fenster integrieren. Mein Versuch war so etwas:

function transferCode(newWin) {
eval ("newWin."+fctName+" = new Function('"+params+"','"+myCode+"')")
}

Eventuelle Tippfehler sind eigentlich draußen, ich tippe aus dem Gedächtnis.

Leider klappt das aber nicht so recht. Gibt es eine andere Möglichkeit Funktion in einem Fenster von außen zu definieren?

  1. Moin!

    Ich habe eine Art Editor für JS geschrieben. Dabei werden Funktionen als Objekt gehalten, d.h. ich habe den Funktionsnamen, eine Parameterliste und den Funktionscode.

    Wie ist das denn zu verstehen?

    Variablen und Funktionen sind in Javascript immer Eigenschaften und Methoden des window-Objektes. Und damit ohnehin sowas wie Objekte, und andererseits sind damit auch Funktionen und Variablen in anderen Fenstern erreichbar, sofern die Fenster erreichbar sind.

    Aus einem geöffneten Fenster auf das öffnende Fenster zuzugreifen funktioniert mit "opener".

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Ich habe den Funktionsnamen, eine Parameterliste und den Funktionscode.

      Wie ist das denn zu verstehen?

      http://ingobartling.de/info/klasse7/html/js_dk/start_jsdk.html

      Es ist zwar nicht die aktuellste Version, aber fürs Verständnis hilft es vielleicht.

      Die im rechten Bereich zu sehenden Funktionen (eventuell müssen erst welche hinzugefügt werden), sollen in ein Fenster, welches bei Klick auf "Ausführen" geöffnet wird, hinzugefügt werden.

      Klarer?

      1. Moin!

        http://ingobartling.de/info/klasse7/html/js_dk/start_jsdk.html

        Es ist zwar nicht die aktuellste Version, aber fürs Verständnis hilft es vielleicht.

        Die im rechten Bereich zu sehenden Funktionen (eventuell müssen erst welche hinzugefügt werden), sollen in ein Fenster, welches bei Klick auf "Ausführen" geöffnet wird, hinzugefügt werden.

        Klarer?

        Dein Beispiel funktioniert bei mir im Opera nicht.

        Deshalb nur allgemein: Ein String wird zu Javascript-Code durch eval(). eval() ist in dem Fenster auszuführen, das den Code enthalten soll. Dementsprechend scheint es mir so zu sein, dass du den String in das neue Fenster transferieren willst - und wie das geht, hatte ich ja schon geschrieben.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!
        1. Dein Beispiel funktioniert bei mir im Opera nicht.

          Es ist halt ein Stand von mitten drin. Inzwischen bin ich schon weiter. Auch auf Opera und anderen Browsern als FF habe ich noch nicht getestet.

  2. ich hatte schon mal gefragt, aber da der Thread im Archiv hängt und das auch nicht geklappt hat, frage ich jetzt nochmals:

    wir hatten dir das aber genau so erklärt wie es auch funktioniert.
    Und nochmal, du "hängst" nichts an eine dokument.

    Dann öffne ich ein neues Fenster und möchte die Funktion in das neue Fenster integrieren. Mein Versuch war so etwas:

    function transferCode(newWin) {
    eval ("newWin."+fctName+" = new Function('"+params+"','"+myCode+"')")
    }

    Hatten wir dir das im alten Thread so gezeigt?
    Ich glaube kaum, kaum jemand benutzt hier eval für sowas und ich meine Cheatah hätte ausdrücklich gesagt, dass new Funktion eval ersetzen kann.

    Leider klappt das aber nicht so recht. Gibt es eine andere Möglichkeit Funktion in einem Fenster von außen zu definieren?

    Klappen nicht so recht, ist natürlich eine ausführlich Fehlerbeschreibung.

    Mir ist es jetzt zu müßig mich durch deine Frames zu hangeln und jedes Skript rauszupicken, aber wenn ich mich recht erinnere hatten wir dir klappende Beispiele gezeigt, warum hast du nicht versucht diese umzusetzen?

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. Mir ist es jetzt zu müßig mich durch deine Frames zu hangeln und jedes Skript rauszupicken, aber wenn ich mich recht erinnere hatten wir dir klappende Beispiele gezeigt, warum hast du nicht versucht diese umzusetzen?

      Naja, ich hab mir dann doch mal alle Dateien runtergeladen, klingt ja interessant was du da vorhast.
      Da ich momentan nur einen Uralt Browser habe, konnte ich nciht try ... catch verwenden, hab es aber so hingekriegt
      http://jstruebig.de/web/javascript/test/tmp/start_jsdk.html

      Du kannst jetzt eine Funktion rechts hinzufügen. Dein Beispiel funktioniert natürlich nicht, da Knopf nicht existiert, aber wenn du z.b. alert('.....'); eingibst und nach dem prüfen hinzufügst, wird diese Funktion rechts ausgeführt (zumindest hier im  IE 4, wie gesagt ich musste da ein paar dinge anpassen und hab den Code mal auf das notwendigste gekürzt)

      Struppi.

      --
      Javascript ist toll (Perl auch!)
      1. Naja, ich hab mir dann doch mal alle Dateien runtergeladen, klingt ja interessant was du da vorhast.

        Danke. Ich habe jetzt alles soweit zusammengebaut, dass es funktioniert. Mit Ausnahme des "Ausführens" natürlich.

        Wahrscheinlich werde ich es so machen, dass ich im neuen Fenster die Variablen definieren und dann im Nachhinein aus diesen Variablen Funktionen mache.

        Also erst

        eval("var sagHallo = null")

        Dann

        sagHallo = new Function("","")

        Du kannst jetzt eine Funktion rechts hinzufügen. Dein Beispiel funktioniert natürlich nicht, da Knopf nicht existiert, aber wenn du z.b. alert('.....'); eingibst und nach dem prüfen hinzufügst, wird diese Funktion rechts ausgeführt (zumindest hier im  IE 4, wie gesagt ich musste da ein paar dinge anpassen und hab den Code mal auf das notwendigste gekürzt)

        Ich schaue mir das mal an.

        1. Wahrscheinlich werde ich es so machen, dass ich im neuen Fenster die Variablen definieren und dann im Nachhinein aus diesen Variablen Funktionen mache.

          Also erst

          eval("var sagHallo = null")

          Dann

          sagHallo = new Function("","")

          Wozu das erste eval?
          Mir scheint du denkst hier ein bisschen umständlich. Es sollte doch einfach reichen: parent.DeinFrame.sagHallo = new Function(....)

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. Wozu das erste eval? -> parent.DeinFrame.sagHallo = new Function(....)

            Weil ich parent.DeinFrame.sagHallo ja nicht so in den Code eingeben kann, da die Funktionen ja unterschiedliche Namen haben.

            1. hi,

              Wozu das erste eval? -> parent.DeinFrame.sagHallo = new Function(....)

              Weil ich parent.DeinFrame.sagHallo ja nicht so in den Code eingeben kann, da die Funktionen ja unterschiedliche Namen haben.

              funktionsname = "sagHallo";
              parent.DeinFrame[funktionsname] = ...

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
          2. Jetzt klappt es schon mal.

            Der Fehler lag in einem falschen replace.

            Das vorgegebene Beispiel sollte also funktionieren, wenn ihr die Funktion erst mal im Editor hinzugefügt habt.

            Die Idee von wahsaga werde ich ggf. noch umsetzen. Jetzt bin ich erstmal froh, dass es überhaupt klappt.

            Was haltet ihr eigentlich insgesamt von dem Ding? Verbesserungsvorschläge? Mal abgesehen von mehr detailiertem Feedback bei Fehleingaben?

            ingo b

            1. Leider klappt es doch nicht. Ihr könnt es ja mal ausprobieren, da ich jetzt noch zwei Beipspiele eingbaut habe.

              Das erste klappt aber das zweite nicht, da die Funktion tranferIt() die variablen eingabeFeld und ausgabeFeld nicht erkennt.

              Hat noch jemand eine Idee woran es liegt? Sollte ich Variablen ähnlich wie die Funktionen behandeln und "von Hand" einzeln erzeugen anstatt eval zu benutzen?

              Vielleicht sollte ich einfach das im Hauptfenster in eine Funktion main() packen und dieser definieren und dann ihre Abarbeitunge anstoßen.

              Ich weiß nicht so recht. Hat jemand eine Idee? Hat einer mich überhaupt verstanden?

              http://www.ingo-bartling.de/info/klasse7/html/js_dk/start_jsdk.html