werbeklaus: Ajax und <script>-Elemente

Hallo wertes Forum!
Ich habe ein Problem (klar, sonst würde ich mich ja nicht melden):

Ich steige gerade auf Ajax um und verwende dabei die fertige Bibliothek von PEAR.
Nun ist die Website an manchen stellen "verschachtelt", das heisst es wird ein div mit Ajax geändert, enthält darin 1 weiteres div was es natürlich auch sofort befüllen soll.

Da jetzt also sofort neuer JS-Code ausgeführt werden soll, ist für mich die logischste Lösung ein
<script type="application/javascript" language="javascript">
mit den Anweisungen.

Aber:
Es funktioniert in allen Browsern, nur Opera stellt sich ein wenig an. Da dieser script-Bereich mit Ajax erst später nachgeladen wird, scheint er ihn nicht auszuführen, denn wenn ich um Ursprungsdokument den gleichen Befehl mit window.setTimeout() starte, funktioniert es.

Hat jemand einen Lösungsvorschlag ? Ich weiss im Moment echt keinen Ausweg mehr für das Problem :-(

Vielen Dank,
werbeklaus

  1. Hi,

    <script type="application/javascript" language="javascript">

    Bist Du sicher, daß Du application/javascript verwenden willst statt dem üblichen text/javascript?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    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 !

      Bist Du sicher, daß Du application/javascript verwenden willst statt dem üblichen text/javascript?

      Wie ich http://de.selfhtml.org/javascript/intro.htm#javascriptbereiche entnehme, eigentlich ja, aber es ging mit dem anderen auch nicht, ich wollte nur schauen, ob der neue Opera 9.0 vllt so streng ist und nur den neuen Standard mag.

      Sonst keine Ideen ?

      werbeklaus

      1. hi,

        Bist Du sicher, daß Du application/javascript verwenden willst statt dem üblichen text/javascript?

        Wie ich http://de.selfhtml.org/javascript/intro.htm#javascriptbereiche entnehme, eigentlich ja

        Warum das?
        Weil da steht:
        "In der Zukunft soll der neue MIME-Typ application/javascript verwendet werden, dieser ist den meisten Browsern allerdings noch unbekannt."

        In Zukunft werden Autos vielleicht auch vollkommen alleine fahren können - nimmst du deshalb heute schon bei 180 auf der Autobahn die Hände vom Steuer?

        Und selbst von du an der Aktualität von SELFHTML in dem Punkt stärkere Zweifel gehabt haben solltest - kurzes googlen bringt Ergebnisse wie http://www.webcoder.info/reference/BrowserFiltering.script.html, wo ebenfalls nachzulesen ist, dass application/javascript so gut wie kein aktueller Browser unterstützt.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          Warum das?
          Weil da steht:
          "In der Zukunft soll der neue MIME-Typ application/javascript verwendet werden, dieser ist den meisten Browsern allerdings noch unbekannt."

          Stimmt, dummer Fehler :-(

          Ich hatte ja geschrieben, dass es daran nicht lag, da es mit text/javascript auch nicht geklappt hatte. Und in beiden Schreibweisen geht es ja in den anderen Browsern!

          werbeklaus

  2. Hallo,

    Nun ist die Website an manchen stellen "verschachtelt", das heisst es wird ein div mit Ajax geändert, enthält darin 1 weiteres div was es natürlich auch sofort befüllen soll.

    Da jetzt also sofort neuer JS-Code ausgeführt werden soll, ist für mich die logischste Lösung ein
    <script type="application/javascript" language="javascript">
    mit den Anweisungen.

    Hm, nein, das wäre für mich keine logische Lösung. Die clientseitige Programmlogik sollte von Beginn an vollständig vorhanden sein. Diese erst bei Bedarf nachzuladen, halte ich persönlich für keine gute Idee. Das Nachladen bei Bedarf sollte sich auf reine Daten beschränken.

    Aber:
    Es funktioniert in allen Browsern, nur Opera stellt sich ein wenig an. Da dieser script-Bereich mit Ajax erst später nachgeladen wird, scheint er ihn nicht auszuführen

    Zeig mal, wie Du das SCRIPT-Element nachträglich einbaust.

    viele Grüße

    Axel

    1. Hallo,

      Hm, nein, das wäre für mich keine logische Lösung. Die clientseitige Programmlogik sollte von Beginn an vollständig vorhanden sein. Diese erst bei Bedarf nachzuladen, halte ich persönlich für keine gute Idee. Das Nachladen bei Bedarf sollte sich auf reine Daten beschränken.

      Wenn ich das richtig verstehe, soll ich die "Programmierlogik" schon von anfang an als JS-Funktionen geladen haben. Dann stellt sich aber das Problem, wie diese aufgerufen werden! Denn ein onload geht nur mit einem body-tag, der aber von anfang an und nur einmal da ist, und ein script-bereich geht ja aus den genannten gründen auch nicht !

      Aber:
      Es funktioniert in allen Browsern, nur Opera stellt sich ein wenig an. Da dieser script-Bereich mit Ajax erst später nachgeladen wird, scheint er ihn nicht auszuführen
      Zeig mal, wie Du das SCRIPT-Element nachträglich einbaust.

      Es handelt sich ja um eine AJAX-Applikation, und zwar verwende ich HTML_AJAX von PEAR. Das schaut dann so aus, dass man eine Funktion aufruft, der man dann die id eines DIVs und eine Datei auf dem Server nennt, worauf diese Datei mit einer neuen Anfrage in das DIV gepackt wird. Der Server kann diese Anfragen nicht unterscheiden.
      Nun wird bei mir also ein DIV befüllt, und direkt danach soll JS ausgeführt werden.
      Das klappt nicht, indem ich in diesem DIV einen <script> bereich habe, und eine Akternative fällt mir wegen dem fehlenden <body> auch nicht ein.

      werbeklaus

      1. Hallo,

        Hm, nein, das wäre für mich keine logische Lösung. Die clientseitige Programmlogik sollte von Beginn an vollständig vorhanden sein. Diese erst bei Bedarf nachzuladen, halte ich persönlich für keine gute Idee. Das Nachladen bei Bedarf sollte sich auf reine Daten beschränken.

        Wenn ich das richtig verstehe, soll ich die "Programmierlogik" schon von anfang an als JS-Funktionen geladen haben. Dann stellt sich aber das Problem, wie diese aufgerufen werden!

        Ajax, zumindest das Nachladen per XMLHTTPRequest, läuft als JavaScript. Dieses Script muss das Nachladen ja anstoßen. Dieses Script bekommt via (onreadystatechange) Bescheid, wie weit der Ladevorgang abgeschlossen ist und kann, bei Erfolg, eine weitere Funktion aufrufen.

        Aber:
        Es funktioniert in allen Browsern, nur Opera stellt sich ein wenig an. Da dieser script-Bereich mit Ajax erst später nachgeladen wird, scheint er ihn nicht auszuführen
        Zeig mal, wie Du das SCRIPT-Element nachträglich einbaust.

        Es handelt sich ja um eine AJAX-Applikation, und zwar verwende ich HTML_AJAX von PEAR.

        Ja, der Fluch des Versuchs, ein Script zu erschaffen, welches alles in allen Browsern kann. Tut mir leid, da quäle ich mich jetzt nicht durch. Hier, speziell in "HTML_AJAX.js", musst Du aber vermutlich mit der Fehlersuche ansetzen. Was ich Dir aus eigener Erfahrung sagen kann, ist, dass ein

        element.innerHTML = "<script id='mySCRIPT' type='text/javascript'>alert('Hallo Welt innerHTML!');</script>";

        nicht funktioniert. Das bei mir allerdings in allen Browsern nicht, nicht nur im Opera nicht. Wenn es bei Dir in einigen Browsern funktioniert, wird scheinbar auch von dem Pear-Script eine irgendwie geartete DOM-Methode eingesetzt.

        Hier mal ein Vergleich, was geht, und was Probleme bereitet:

          
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  
                "http://www.w3.org/TR/html4/strict.dtd">  
        <html>  
        <head>  
        <title>Nachtraegliches Einfuegen von SCRIPT-Elementen</title>  
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
        <script type="text/javascript">  
        function bindeSCRIPTeinMitInnerHtml() {  
          //Wird zwar eingehaengt, aber in allen Browsern, die ich getestet habe (IE6.0, FF1.5.0.4, Opera8.5.4), nicht ausgefuehrt. Opera haengt nur ein leeres SCRIPT-Element ein.  
          var myBody = document.body;  
          if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));  
          myBody.innerHTML += "<script id='mySCRIPT' type='text/javascript'>alert('Hallo Welt innerHTML!');<\/script>";  
          alert(myBody.innerHTML);  
        }  
          
        function bindeSCRIPTeinMitDOM1() {  
          //Die [link:http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html@title=DOM-Core-Variante] mit setAttribute und SCRIPT-Inhalt als TextNode,  
          //funktioniert nur im FF1.5.0.4 und Opera8.5.4, IE kann den TextNode nicht einhaengen  
          var myBody = document.body;  
          if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));  
          var mySCRIPT = document.createElement("SCRIPT");  
          mySCRIPT.setAttribute("type", "text/javascript");  
          mySCRIPT.setAttribute("id", "mySCRIPT");  
          mySCRIPT.appendChild(document.createTextNode("alert('Hallo Welt DOM1!');"));  
          myBody.appendChild(mySCRIPT);  
          alert(myBody.innerHTML);  
        }  
          
        function bindeSCRIPTeinMitDOM2() {  
          // verwendet die Eigenschaft [link:http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-81598695@title=HTMLScriptElement].text  
          //funktioniert in allen getesteten Browsern (siehe oben)  
          var myBody = document.body;  
          if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));  
          var mySCRIPT = document.createElement("SCRIPT");  
          mySCRIPT.type = "text/javascript";  
          mySCRIPT.id = "mySCRIPT";  
          //Opera8.5.4 fuehrt die Anweisungen sofort aus, noch bevor das Element ueberhaupt eingehaengt wurde.  
          mySCRIPT.text = "alert('Hallo Welt DOM2!');";  
          //Opera8.5.4 fuehrt die Anweisungen nochmal aus, nachdem das Element eingehaengt wurde.  
          myBody.appendChild(mySCRIPT);  
          //Opera8.5.4 haengt nur ein scheinbar ;-) leeres SCRIPT-Element ein.  
          alert(myBody.innerHTML);  
        }  
          
        function bindeSCRIPTeinMitDOM3() {  
          var myBody = document.body;  
          if (document.getElementById("mySCRIPT")) myBody.removeChild(document.getElementById("mySCRIPT"));  
          var mySCRIPT = document.createElement("SCRIPT");  
          mySCRIPT.type = "text/javascript";  
          mySCRIPT.id = "mySCRIPT";  
          myBody.appendChild(mySCRIPT);  
          //Wir setzen den Inhalt des SCRIPT-Elements erst, wenn es schon eingehangen ist, um den Opera auch noch zu ueberreden ;-)  
          mySCRIPT.text = "alert('Hallo Welt DOM3!');";  
          alert(myBody.innerHTML);  
        }  
        </script>  
        </head>  
        <body>  
        <h1>Hallo Welt!</h1>  
        <p><button onclick="bindeSCRIPTeinMitInnerHtml()">Binde SCRIPT ein mit innerHTML!</button></p>  
        <p><button onclick="bindeSCRIPTeinMitDOM1()">Binde SCRIPT ein mit DOM1!</button></p>  
        <p><button onclick="bindeSCRIPTeinMitDOM2()">Binde SCRIPT ein mit DOM2!</button></p>  
        <p><button onclick="bindeSCRIPTeinMitDOM3()">Binde SCRIPT ein mit DOM3!</button></p>  
        </body>  
        </html>  
        
        

        Das schaut dann so aus, dass man eine Funktion aufruft, der man dann die id eines DIVs und eine Datei auf dem Server nennt, worauf diese Datei mit einer neuen Anfrage in das DIV gepackt wird.

        Ja, Deine Aufgabe ist nun, herauszufinden, wie das Pear-JavaScript dies tut.

        Wenn Du noch Hilfe willst, solltest Du uns das zumindest mal irgendwohin hochladen, damit man sich das Problem mal ansehen kann.

        viele Grüße

        Axel

        1. Hi Axel!
          Ich wollt mich recht für deine aufwändige Hilfe bedanken, es klappt jetzt alles. Ich habe mich tief in das AJAX-Gewühl eingegraben. Beim abschließen des Ladevorgangs wird dort jetzt deine script-einbinde-Funktion verwendet, um den neuen Anstoß zu geben.
          Also vielen Dank dir für die Mühe!
          werbeklaus