phil1987: Javascript in eingebundener AJAX-Datei

Hallo

ich habe eine Datei die JS-Code enthält. Diese Datei binde ich mittels AJAX in eine andere Webseite ein. Dann habe ich das Problem das der JS-Code der eingebundenen Seite nicht mehr ausgeführt wird. Kann ich das trotzdem irgendwie so gestalten, dass das funktioniert!?

Viele Grüße
phil

  1. Hallo phil1987,

    schau dir mal diese Diskussion an: http://forum.de.selfhtml.org/archiv/2008/8/t175184/.

    Kurz: Du musst das Script aus der Datei extrahieren und in ein dynamisch erstelltes Script-Element schreiben.

    Gruß, Jürgen

    1. Hallo,

      schau dir mal diese Diskussion an: http://forum.de.selfhtml.org/archiv/2008/8/t175184/.

      Zu dem Zeitpunkt war ich leider weg vom Fenster.

      Kurz: Du musst das Script aus der Datei extrahieren und in ein dynamisch erstelltes Script-Element schreiben.

      Was ist denn bitte an eval in dem Fall verkehrt?

      Axel kramt da Quellen heraus, die überhaupt nichts mit diesem Szenario zu tun haben.

      Dein Argument ist "eval genießt einen schlechten Ruf und ist fast immer überflüssig".
      Das ist völlig richtig, sagt aber auch nichts zum Thema.

      Wenn ich JavaScript-Quellcode in einem String habe, wieso soll ich dann im DOM herumfummeln mit fünfzehn Befehlen, um ein script-Element einzufügen, wenn ich dasselbe mit einem Funktionsaufruf erschlagen kann? Was spricht hier gegen "KISS"?

      eval ist genau für diesen Fall prädestiniert und m.W. auch die beste und geradlinigste Lösung. Für ungefähr alle anderen Fälle ist eval eine der schlechteren Alternativen, meist die schlechteste.

      Mathias

      1. Hallo molily,

        du bist also der Meinung, nachgeladene Scripte sollten mit "eval" zur Verfügung gestellt werden. Da stimme ich dir gerne zu. Auch wenn nur vier Befehle benötigt werden, um ein Script ins DOM einzufügen, sollte man ruhig die kürzere Version wählen.

        Gruß, Jürgen

        PS Vieleich gibt es im neuen selfhtml ja ein AJAX-Kapitel, in dem dann auch das Thema "Nachladen von Javascripten" behandelt wird. Die Fragen dazu kommen meiner Meinung nach immer häufiger.

        1. Hallo,

          du bist also der Meinung, nachgeladene Scripte sollten mit "eval" zur Verfügung gestellt werden.

          Nach meinem jetzigen Wissenstand ja, wobei die Frage nach den Vorteilen der DOM-Methode bzw. Nachteilen von eval durchaus ernst gemeint war.

          Einige nennst du ja auf deiner Testseite bereits. Die DOM-Einbindung ist asynchron zum einbindenden Script, d.h. um gleichwertiges zu erreichen, müsste man eval mit setTimeout aufrufen. Je nachdem, was man vorhat, ist das eine oder das andere Verhalten gewünscht.

          eval() halte ich vor allem in einem Fall für sinnvoll: Man holt mit XMLHttpRequest HTML-Code, in dem auch, aber nicht nur script-Elemente mit JavaScript-Code vorhanden sind. Wenn man die nun mit innerHTML ins Dokument schreibt, hängen die script-Elemente dort zwar korrekt drin, werden aber bekanntlich nicht ausgeführt. In dem Fall wäre DOM-Einbindung zwar möglich, dann müsste man aber sinnigerweise die existierenden script-Elemente mit sich selbst überschreiben. Etwa so:

          var divE = document.getElementById("div");  
          divE.innerHTML = "<p>Test</p><script type='text/javascript'>alert('hallo welt');<\/script><script type='text/javascript' src='test.js'><\/script>"; // Beispielhaft für einen möglichen XMLHttpRequest-responseText  
          var scripts = divE.getElementsByTagName("script");  
          for (var i = 0, script, newScript; script = scripts[i]; i++) {  
           newScript = document.createElement("script");  
           newScript.type = "text/javascript";  
           if (script.src) {  
            newScript.src = script.src;  
           } else {  
            newScript.text = script.text;  
           }  
           script.parentNode.replaceChild(newScript, script);  
          }
          

          Wenn man *nur* JavaScript-Code vom Server nachladen will, dann kann man direkt ein script-Element mit entsprechendem src-Attribut einbinden. XMLHttpRequest o.ä. ist dann nicht unbedingt nötig. Dieses Einbinden läuft zwar asynchron, aber es ist kein Problem, dem Server den Namen einer Callback-Funktion zu übergeben (à la JSONP), die aufgerufen wird, wenn der nachgeladene Code ausgeführt ist. Anders würde XMLHttpRequest auch nicht funktionieren, nur der readystatechange-Handler muss nicht global sein.

          Mathias

          1. Hallo molily,

            Wenn man *nur* JavaScript-Code vom Server nachladen will, ...

            mir ging es bei meinen Tests darum, Scripte nachzuladen, (nur) wenn sie gebraucht werden. Ich habe dazu eine Dummyfunktion angelegt, die beim ersten Aufruf die JS-Datei nachlädt, sich dabei selbst überschreibt und dann die neue Version gleichen Namens aufruft. Diese geht dann aber nur synchron. Sonst würde ich auch die Variante mit "script.src" vorziehen.

            Gruß, Jürgen