schmidtjr: JavaScript dynamisch nachladen IE

Hi

Ich erhalte durch eine XSL Transformation einen <SCRIPT> Block, welcher eine Funktion enthält. Durch die XSL Transformation wird dieser in einen Teilbereich der Seite eingefügt und somit nicht interpretiert und die Funktion steht mir nicht zur Verfügung.

Also wollte ich die Funktion nachträglich einfügen.
Dies Methode hier scheint dafür geeignet zu sein:

  
var headID = document.getElementsByTagName("head")[0];  
var newScript = document.createElement('script');  
newScript.type = 'text/javascript';  
newScript.src = 'http://www.somedomain.com/somescript.js';  
headID.appendChild(newScript);

Allerdings liegt mein JS nicht als Datei vor, sondern müsste in den Script Block rein, als inline Content quasi. Wie funktioniert das ganze im IE?
im FF funktioniert ein
newScript.innerHTML = 'alert("hallo")';
wunderbar. im IE habe ich bis jetzt keine Möglichkeit gefunden etwas in den <SCRIPT> Block zu schreiben. ich kann nur Attribute setzen.
Wie kann ich meinen Code IN den Script block setzen?

ich kann auch nicht den <Script> block inklusive inhalt auslesen und als Child an den head dranhängen, da der Script Block im IE nicht im DOM auftaucht!! Meine Lösung für dieses Problem war die javascript funktion per XSL in ein <div> zu schreiben und daraus durch innerHTML an den JavaScript code zu kommen. nachdem die JS funktion nachgeladen wurde wollte ich dieses DIV löschen.

Das Problem ist aber halt, das einfügen des Codes in den Script Block im IE. innerHTML, innerText,value...  ich habe nix passendes gefunden.

Ich bin über Vorschläge dankbar,
Mit freundlichen Grüßen
ich

  1. Hi,

    Hi

    Ich erhalte durch eine XSL Transformation einen <SCRIPT> Block, welcher eine Funktion enthält. Durch die XSL Transformation wird dieser in einen Teilbereich der Seite eingefügt und somit nicht interpretiert und die Funktion steht mir nicht zur Verfügung.

    ???
    Weil die Funktion eingebaut wird, steht sie nicht zur Verfügung?

    Der Rest liest sich genauso konfus ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi

      Hm. Nagut. dann halt nochmal.

      Ich habe eine Seite und ein Teilbereich der Seite wird mit Hilfe von Sarissa dynamisch aus einer XML Datei erstellt und in ein <div id="content"> geladen.
      Während dieser Transformation erstellt das XSL auch einige JavaScript Funktionen dynamisch. Diese werden dann ebenfalls in das content div integriert, da ja nur dieser Bereich der Seite von der Transformation betroffen ist.
      Das nachträgliche Einfügen der <script> Bereiche im Content div führt jedoch dazu, dass diese vom Javascript interpreter nicht interpretiert werden und darin definierte Funktionen somit nicht bekannt sind! (onChange deklarationen von elementen funktionieren interessanterweise, nur die funktionsdefinitionen nicht).

      Daher die Idee die Funktionen NACH der Transformation in den Head Bereich der Seite einzubinden (per appendChild), da sie dann dem JavaScript interpreter bekannt sind und verwendet werden können.

      Im FireFox funktioniert das Ganze wunderbar auf die folgende Weise:

        
      var headID = document.getElementsByTagName("head")[0];  
      var newScript = document.createElement('script');  
      newScript.type = 'text/javascript';  
      newScript.innerHTML = document.getElementById("xsl_JavaScript").innerHTML;  
      headID.appendChild(newScript);
      

      das element "xsl_javascript" ist hierbei z.B. ein <script> mit entspr. id, welcher während der xsl transformation dem dokument innerhalb des content divs hinzugefügt wurde.

      Ich hoffe bis hier her ist es noch verständlich.

      Nun die Probleme im IE:
      1. <script>.innerHTML gibt es nicht! Auch andere Varianten um die Methodendefinition in das neu erstellte <script> element zu schreiben habe ich nicht gefunden!
      (diese variante funktioniert z.B. auch nicht)

        
      newScript.appendChild(document.createTextNode(document.getElementById("xsl_JavaScript").innerHTML));
      

      2. wenn ich per XSL ein <script> objekt erstelle erscheint dieses NICHT im DOM des dokuments! (IE developer Toolbar zeigt es nicht). Deswegen, und weil ein <script> block keine id definiert hat, wird statt
      <script type="text/javascript">myFunc = function(){alert("hallo");};</script>
      halt einfach
      <div id="xsl_JavaScript" style="disply:none">myFunc = function(){alert("hallo);};</div>
      erstellt. Mit dem Ziel den innerHTML dieses divs in einen script block zu packen und den div der ordnung halber anschließend zu löschen.

      Das eigentliche Problem ist also das dynamische Erstellen von Javascript funktionen welche durch eine XSL transformation dem document hinzugefügt wurden.
      Der Ansatz das ganze in den <head> Bereich zu schreiben erscheint mir sinnig, da auf diese Weise ja z.B. externe .js Skripte nachträglich eingebunden werden können, und es ja im FF auch funktioniert.
      Die daraus resultierende Frage ist also:
      Wie kriege ich in den <script> block meinen inhalt?
      achtung pseudocode:
      <script type="text/javascript">innerHTML von xsl_JavaScript-div</script>

      Alternativ natürlich auch andere Vorschäge um meine Funktionen zu nutzen!
      Hier nocheinmal der Hinweis, onChange definitionen von input fields funktionieren nach der transformation bereits. sie sollen jedoch die dynamisch erstellte funktion aufrufen! und diese ist nicht bekannt!!

      So, ich hoffe das ganze war nun verständlich erklärt.

      grüße
      ich

  2. Hallo schmidtjr,

    ich habe mal ein wenig mit dem Nachladen von Javscripten experimentiert:

    http://www.j-berkemeier.de/test/Nachladen.html

    Vieleicht hilf es dir ja als Basis für die Lösung deines Problems.

    Gruß, Jürgen

    1. Hi

      ja :) die Seite zeigt genau das auf was mein Problem ist :)
      Bei Variante 1 versuchst du dem <script> element einen textnode anzuhängen. Aber dein Kommentar verweist genau auf das Problem :) diese Variante funktioniert bei deiner Seite und dem IE auch nicht.

      Bei der dritten Variante setzt du das src attribut von <script> auf eine datei(url). diese möglichkeit is bei mir denke ich nicht anwendbar, da ich keine datei habe sondern nur diesen dynamischen textbaustein.

      Variante 2 habe ich eben ausprobiert. Funktioniert im Firefox wunderbar, im IE erhalte ich einen Object Error mit der aussagekräftigen fehlernummer -2147467259

      Hallo schmidtjr,

      ich habe mal ein wenig mit dem Nachladen von Javscripten experimentiert:

      http://www.j-berkemeier.de/test/Nachladen.html

      Vieleicht hilf es dir ja als Basis für die Lösung deines Problems.

      Gruß, Jürgen

      1. Hi

        Ich ziehe alles zurück!

        Hatte zwischenzeitlich die Output Method des XSL wieder auf html gestellt. Daher dieser komische Object error! wenn sie auf xml steht funktioniert methode 2!
        wunderbar!! Dankeschön.

        Also nochmal falls es für jemand interessant ist:

          
        eval(document.getElementById("xsl_JavaScript").innerHTML);  
        
        

        So funktioniert es auch im IE.
        Das Script muss allerdings wie bereits erwähnt für den IE in einem div zur Verfügung gestellt werden, da er bei <script> weder ID noch innerHTML kennt und interessanterweise den script block auch gar nciht im DOM hat.

        Dankeschön!

        1. Hallo,

          Also nochmal falls es für jemand interessant ist:

          eval(document.getElementById("xsl_JavaScript").innerHTML);

          
          >   
          > So funktioniert es auch im IE.  
          
          Eval is evil.  
            
          [Nachtraegliches Einfuegen von SCRIPT-Elementen](http://forum.de.selfhtml.org/archiv/2006/6/t131082/#m847831)  
            
            
          viele Grüße  
            
          Axel
          
          1. Hi

            Na toll :) Da probiert man alle möglichen Varianten aus um den inline content des skript blocks zu ändern und dann ist es sowas simples wie script.text.
            argh, das tut weh :)

            warum soll man denn nicht eval() nehmen und es stattdessen in den DOM einhängen? funktionieren tut ja nun beides.

            mit freundlichen Grüßen
            ich

            1. Hallo schmidtjr,

              warum soll man denn nicht eval() nehmen und es stattdessen in den DOM einhängen? funktionieren tut ja nun beides.

              eval genießt einen schlechten Ruf und ist fast immer überflüssig, wie ja auch gerade von Axel gezeigt wurde. Ich habe mein Beispiel um die Version aus dem Archiv mit .text erweitert und es scheint zu funktionieren. Danke an Axel.

              Gruß, Jürgen