Ralf: onload bei dynamisch erzeugtem IFRAME im IE funktioniert nicht

Beitrag lesen

Prinzipiell ja, nur in dem Falle nützt dir das nichts, da die Funktion ja innerhalb des Objektes observe aufgerufen wird mit dort definierten Parametern (müßte in der Doku stehen)

Die Funktion erhält den Event als Parameter. Entscheidend ist, in welchem Scope die Funktion läuft (worauf bezieht sich this?)und das hängt vom Browser ab. Für Firefox und Opera ist es das Element, also in diesem Fall der iframe. Für den IE ist es jedoch window, was an der unterschiedlichen Implementation der Events liegt. Und da kommt dann bindAsEventListener ins Spiel, wobei mir die Forensuche geholfen hat: http://forum.de.selfhtml.org/archiv/2007/2/t147171/#m954903.

Wie gesagt da kann ich dir nicht weiterhelfen, ich habe die noch nie benutzt, studiere aber immer mal wieder den Code.

Der ist hoch interessant, aber für mich noch nicht zugänglich.

Schwer zu sagen,
In meinen Bokmark ist z.b. das http://phrogz.net/JS/Classes/OOPinJS.html

Das werde ich mir mal ansehen, wenn ich Zeit habe. Für den Moment steht die Lösung im Vordergrund, die ich jetzt auch erreicht habe:

  
  var vorlagen = document.getElementsByClassName("vorlage");    //prototype.js  
  if (!vorlagen.length) return;  
  var nf = new Array();  
  for (var i=0; i<vorlagen.length; i++) {  
    var prodid = vorlagen[i].className.match(/\d+/);  
    if (prodid) {  
      nf[i] = document.createElement("IFRAME");  
      nf[i].style.display = "none";  
      vorlagen[i].appendChild(nf[i]);  
//      nf[i].src = "produkt.aspx?produktid="+prodid; *** tut nicht im FF  
      nf[i].contentWindow.location.href = "produkt.aspx?produktid="+prodid;  
      Event.observe(nf[i], 'load', function(evt) {      //prototype.js  
        var v = this.contentWindow.document.getElementById("vorlage");  
        if (v) this.parentNode.innerHTML += v.innerHTML;  
//        if (v) this.parentNode.appendChild(v); *** und das mag der IE nicht  
        Event.stop(evt);  
        }.bindAsEventListener(nf[i]));  
      }  
    }  

Drei Dinge habe ich verändert:

1. Die iframe-Elemente stehen nun in einem Array, damit sie voneinander unterschiedlich sind. Bei meiner ersten Variante gab es nur ein Objekt nf.

2. Per bindAsEventListener wird die Funktion an das iframe Element gebunden, so dass mit this ein Bezug darauf möglich ist.

3. Die iframes werden nicht mehr am body angehängt sondern direkt in die zu füllenden DIV-Container eingesetzt. Dadurch besteht in der Funktion Zugriff auf den Container via parentNode.

Diese Lösung funktioniert und damit bin ich zunächst mal zufrieden. Aber irgendwie habe ich das Gefühl, dass man das auch noch viel eleganter - eben mit Objekten und Methoden lösen könnte. Allein schon der Array für die iframes wirkt irgendwie künstlich.

eigentlich ganz simpel.

Ich habe auch weniger das Problem mit den Definitionen als vielmehr mit den Auswirkungen wie z.B. Vererbung.

Ralf