Moosi: Problem mit IE: Javascript-code mit AJAX nachladen und ausführen

Hallo zusammen,

ich habe ein Problem mit dem Ausführen von per Ajax nachgeladenem Javascript Code (einfach ein Alert). Im FF funktioniert das prima, aber der IE 7 macht gar nix. Ich verwende dazu folgende Funktion über die mehrmals im www berichtet wurde, dass dies funktionieren sollte:

execJS : function (node) {

var st = node.getElementsByTagName('SCRIPT');
 var strExec;

var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
 var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
 var bMoz = (navigator.appName == 'Netscape');

for(var i=0;i < st.length; i++) {
 if (bSaf) {
   strExec = st[i].innerHTML;
 }
 else if (bOpera) {
   strExec = st[i].text;
 }
 else if (bMoz) {
   strExec = st[i].textContent;
 }
 else {
   strExec = st[i].text;
 }
 try {
   eval(strExec);
 } catch(e) {
   alert(e);
 }
      }
},

Aufgerufen wird diese Funktion folgendermaßen:

function processAXAH(elementContainer){
  if (theHttpRequest.readyState == 4)
  {
   if (theHttpRequest.status == 200) {
    document.getElementById(elementContainer).innerHTML = theHttpRequest.responseText;
    if (execJavaScriptAfterTransfer == true) { execJS(document.getElementById(elementContainer)); }
   }
   else
   { document.getElementById(elementContainer).innerHTML="Error! Fehler: " + theHttpRequest.statusText; }
  }
 }

Den restlichen Ajax-Krempl drumherum spare ich mal zwecks der Übersichtlichkeit aus. Dies funktioniert ja alles. Es gehr nur darum das Script nachträglich mit eval auszuführen.

Im Internet habe ich noch gefunden dass man angeblich für den IE per DOM erst wieder den Script Tag drumherum aufbauen müsste. Ungefähr so:

var newScript = document.createElement('script');
newScript.setAttribute('type','text/javascript');
newScript.setAttribute('src',url);
document.getElementById("script").appendChild(newScript);

Bin ich da auf dem richtigen Weg???

Leider kriege ich das aber trotz bestem Bemühen selbst nicht ans fliegen und google bringt zwar viele Treffer aber nichts wirklich ergiebiges. Ich weis aber das es gehen muss, da z.B. in Twobirds ja das auch irgendwie so gemacht wird.

Hat jemand eine Fundstelle wo wirklich nachvollziehbar erklärt wird wie das nun geht?
Oder hat jemand sogar eine auch mit IE funktionierende Funktion?
Bin für jeden Tip dankbar!

PS: Es geht mir darum auszuloten was man mit Ajax alles machen kann. Deshalb bitte keine Grundsatzdiskussion zur Sinnhaftigkeit von Ajax.

Vielen Dank im Voraus!

Moosi

  1. Hallo Moosi,

    var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
    var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
    var bMoz = (navigator.appName == 'Netscape');

    wozu brauchst du die Browserweiche?

    document.getElementById(elementContainer).innerHTML = theHttpRequest.responseText;
        if (execJavaScriptAfterTransfer == true) { execJS(document.getElementById(elementContainer)); }

    warum kopierst du das Script erst als HTML in ein Element? Führe es doch direkt aus:

    var JS_String = theHttpRequest.responseText;
      eval(JS_String);

    Gruß, Jürgen

    1. Hallo Moosi,

      var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
      var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
      var bMoz = (navigator.appName == 'Netscape');

      wozu brauchst du die Browserweiche?

      document.getElementById(elementContainer).innerHTML = theHttpRequest.responseText;
          if (execJavaScriptAfterTransfer == true) { execJS(document.getElementById(elementContainer)); }

      warum kopierst du das Script erst als HTML in ein Element? Führe es doch direkt aus:

      var JS_String = theHttpRequest.responseText;
        eval(JS_String);

      Gruß, Jürgen

      Moin Jürgen,

      var JS_String = theHttpRequest.responseText;
      eval(JS_String);

      einfach so direkt auszuführen geht nach meiner Meinung nicht, da in der Rückgabe HTML und JS ja durcheinander enthalten ist. Deswegen muss erst der/die <script> Bereich(e) herausgepfriemelt werden.

      Außerdem muss meines Wissens der der eval auf den per innerHTML gefüllten DIV erfolgen. Hast recht, die Browserweiche verwirrt. Ich hätte sie aus dem Beispielcode herauslassen sollen. Aber dort dürfte das Problem nicht liegen.

      Grüße

      Moosi

      1. Hallo Moosi,

        einfach so direkt auszuführen geht nach meiner Meinung nicht, da in der Rückgabe HTML und JS ja durcheinander enthalten ist. Deswegen muss erst der/die <script> Bereich(e) herausgepfriemelt werden.

        das würde ich mit getElementsByTagName machen, angewendet auf responseXML.

        Außerdem muss meines Wissens der der eval auf den per innerHTML gefüllten DIV erfolgen. Hast recht, die Browserweiche verwirrt. Ich hätte sie aus dem Beispielcode herauslassen sollen. Aber dort dürfte das Problem nicht liegen.

        was sagt denn die Fehler-Konsole dazu? So weit ich weiß, darf eval nur auf "reines" Javascript angewendet werden, nicht aber auf HTML.

        Gruß, Jürgen

  2. var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
    var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
    var bMoz = (navigator.appName == 'Netscape');

    Noch ein Wort zu deinem Versuch die Fähigkeit eines Browsers zu ermitteln, userAgent ist eine frei wählbare Eigenschaft, die nichts aussagt darüber was der Browser kann und in deinem Fall ist es auch nicht so dass es nicht eine bessere Lösung gäbe.

    strExec = st[i].innerHTML || st[i].text || st[i].textContent;

    Oder halt in der Reihenfolge, die das Beste Ergebniss für dich bringt.

    PS: Es geht mir darum auszuloten was man mit Ajax alles machen kann. Deshalb bitte keine Grundsatzdiskussion zur Sinnhaftigkeit von Ajax.

    Eigentlich ist schon die Sinnhaftigkeit JS hier ausführen zu wollen fraglich. Da diese Methode Schwierigkeinten bereitet, sollte man sich besser überlegen, ob man das JS nicht einfach in einen .js Datei auslagert.

    Struppi.