benedik.s: Firefox 2.0.0.2 Probleme nach appendChild

Servus,

ich füge über folgende Zeilen ein neues Javascript auf meiner Seite ein:

/* Create new script element */
var java_script      = document.createElement('script');
java_script.language = "JavaScript";
java_script.type     = "text/javascript";
java_script.text     = service.lib;
/* Add script element to DOM */
document.getElementsByTagName('head')[0].appendChild(java_script);

service.lib enthält dabei den script code

bisher konnte ich nun immer über - windowservice.service_name + "initService"; - initService-Funktion des angefügten Skript aufrufen.

Seit dem letzen FF-Update weigert sich dieser allerding die Funktion aufzurufen. Im IE funktioniert es nach wie vor.

Auch den Funktionsnamen zusammen zu setzen und dann direkt aufzurufen:
z.B.
var function_name = service.service_name + "initService";
function_name();

funktioniert leider nicht.

FF meckert nun immer, dass die Funktion nicht vorhanden ist:
"window[service.service_name + "__initService"] is not a function"

Wenn ich über DOM-Inspector das Script-Element ansehe ist die Funktion da. Das Anfügen hat demnach funktioniert.

---

Any ideas?

Gruß,
Benedikt

  1. Hallo benedik.s,

    java_script.text     = service.lib;

    bist Du Dir hier sicher? Ich nehme immer src=...

    Gruß, Jürgen

    1. Hallo benedik.s,

      java_script.text     = service.lib;

      bist Du Dir hier sicher? Ich nehme immer src=...

      Gruß, Jürgen

      Ja, src verwendest du wenn du einen Dateipfad hinterlegst.
      Die service.lib Variable enthält aber schon direkt den Text der Funktionen.

      Gruß,
      Benedikt

      1. Hallo benedikt.s,

        Ja, src verwendest du wenn du einen Dateipfad hinterlegst.
        Die service.lib Variable enthält aber schon direkt den Text der Funktionen.

        ups, das ".lib" habe ich für eine (unkonventionelle) Extension gehalten.

        Gruß, Jürgen

  2. /* Create new script element */
    var java_script      = document.createElement('script');
    java_script.language = "JavaScript";
    java_script.type     = "text/javascript";
    java_script.text     = service.lib;
    /* Add script element to DOM */
    document.getElementsByTagName('head')[0].appendChild(java_script);

    service.lib enthält dabei den script-code

    Mal abgesehen davon, dass ich das etwas ungewöhnlich finde (ich würde setAttribute() und createTextNode() benutzen) und mit so einer Konstruktion (einbinden von Code durch Einhängen eines <script>-Elements) eh meist Ärger hatte: Steckt hinter service.lib eine externe Datei oder eine Variable, die den Code enthält? In letzterem Fall kannst Du den ganzen Aufwasch da oben auch einfacher haben:

    var Funktion = new Function(service.lib);

    Aufruf dann ganz einfach mit

    Funktion();

    1. Hallo Zabraham.

      /* Create new script element */
      var java_script      = document.createElement('script');
      java_script.language = "JavaScript";
      java_script.type     = "text/javascript";
      java_script.text     = service.lib;
      /* Add script element to DOM */
      document.getElementsByTagName('head')[0].appendChild(java_script);

      service.lib enthält dabei den script-code

      Mal abgesehen davon, dass ich das etwas ungewöhnlich finde (ich würde setAttribute() […] benutzen)

      … und am IE scheitern.

      Einen schönen Dienstag noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. /* Create new script element */
        var java_script      = document.createElement('script');
        java_script.language = "JavaScript";
        java_script.type     = "text/javascript";
        java_script.text     = service.lib;
        /* Add script element to DOM */
        document.getElementsByTagName('head')[0].appendChild(java_script);

        service.lib enthält dabei den script-code

        Mal abgesehen davon, dass ich das etwas ungewöhnlich finde (ich würde setAttribute() […] benutzen)

        … und am IE scheitern.

        Weil?

        1. Hallo Zabraham.

          /* Create new script element */
          var java_script      = document.createElement('script');
          java_script.language = "JavaScript";
          java_script.type     = "text/javascript";
          java_script.text     = service.lib;
          /* Add script element to DOM */
          […]

          Mal abgesehen davon, dass ich das etwas ungewöhnlich finde (ich würde setAttribute() […] benutzen)

          … und am IE scheitern.

          Weil?

          Sagte ich bereits: IE.

          Einen schönen Dienstag noch.

          Gruß, Mathias

          --
          ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
          debian/rules
    2. Mal abgesehen davon, dass ich das etwas ungewöhnlich finde (ich würde setAttribute() und createTextNode() benutzen) und mit so einer Konstruktion (einbinden von Code durch Einhängen eines <script>-Elements) eh meist Ärger hatte: Steckt hinter service.lib eine externe Datei oder eine Variable, die den Code enthält? In letzterem Fall kannst Du den ganzen Aufwasch da oben auch einfacher haben:

      setAttribute() macht wohl bei manchen IE Versionen Probleme. Auf diesem Weg hat es bisher mit allen Browsern funktioniert die ich getestet habe.

      var Funktion = new Function(service.lib);

      Aufruf dann ganz einfach mit

      Funktion();

      ja, service.lib ist eine Variable die den Code enthält. Allerdings können dort beliebig viele Funktionen drin stecken. Funktioniert das dann auch noch mit dem new Function() ??

      Gruß,
      Benedikt

  3. Hallo benedik.s.

    ich füge über folgende Zeilen ein neues Javascript auf meiner Seite ein:

    /* Create new script element */
    var java_script      = document.createElement('script');
    java_script.language = "JavaScript";
    java_script.type     = "text/javascript";
    java_script.text     = service.lib;
    /* Add script element to DOM */
    document.getElementsByTagName('head')[0].appendChild(java_script);

    service.lib enthält dabei den script code

    bisher konnte ich nun immer über - windowservice.service_name + "initService"; - initService-Funktion des angefügten Skript aufrufen.

    Seit dem letzen FF-Update weigert sich dieser allerding die Funktion aufzurufen. Im IE funktioniert es nach wie vor.

    Offenbar ist die JS-Engine des Firefox gehörig langsamer geworden. Ich kann dein Problem nachvollziehen aber eine Kontrolle der Anzahl der script-Elemente z. B. per DOM-Inspektor zeigt, dass das neue Element eingefügt wurde. Ruft man hiernach eine darin spezifierte Funktion manuell auf, wird sie problemlos ausgeführt.

    Dir bleibt also augenscheinlich nichts Anderes übrig, als die Funktionen erst dann auszuführen, wenn Firefox sie registriert hat. Dies kannst du in einem Interval so lange überprüfen, bis das der Fall ist.

    Einen schönen Donnerstag noch.

    Gruß, Mathias

    --
    ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
    debian/rules
    1. Hallo nochmal.

      Seit dem letzen FF-Update weigert sich dieser allerding die Funktion aufzurufen. Im IE funktioniert es nach wie vor.

      Offenbar ist die JS-Engine des Firefox gehörig langsamer geworden.

      … was auch nicht unbekannt ist. Mit der aktuellen Version 2.0.0.3 vom Firefox wurde dieser Fehler behoben. (Soeben überprüft.)

      Einen schönen Donnerstag noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
  4. Seit dem letzen FF-Update weigert sich dieser allerding die Funktion aufzurufen. Im IE funktioniert es nach wie vor.

    »»

    FF meckert nun immer, dass die Funktion nicht vorhanden ist:
    "window[service.service_name + "__initService"] is not a function"

    Sehr interessant - die FF-Entwickler haben ihren Fehler wohl selbst bemerkt. Seit Gestern (Update auf FF 2.0.0.3) funktioniert die Sache wieder.

    Wers testen will - hier:

    http://www.schwinkendorf.info/diplarbeit/student_job/client.html

    Grüße,
    Benedikt