3rdInvisible: dynamische iframes

Hallo an alle!

Leider finde keine wirkliche Erklärung zu meinem Problem, denn logik schein dem ie fremd, oder mir !?!

folgender code :

  
<html>  
<head>  
</head>  
<script language="JavaScript">  
var Class = { create: function(){ return function(){ this.initialize.apply(this, arguments); } } }  
  
var CAjaxUploadForm = Class.create();  
CAjaxUploadForm.prototype.initialize=function(id,reciever,action,target){  
  this.id=id;  
  this.reciever=reciever;  
  this.target=target;  
  this.action=action;  
  this.html=function(elementtype){return document.createElement(elementtype);};  
  this.make=function(){  
   this._form = document.createElement("FORM");  
   this._form.id="form_" + id;  
   this._form.name="form_" + id;  
   this._form.method="post";  
   this._form.enctype="multipart/form-data";  
   this._form.target=this.target;  
   this._form.action=this.action;  
  
   this._file = document.createElement("INPUT");  
   this._file.type="file";  
   this._file.id=this._file.name="file_" + this.id;  
  
   this._button = document.createElement("INPUT");  
   this._button.type="button";  
   this._button.value="upload";  
   var func = this.onClick(this._form.id);  
   this._button.onclick=func;  
  
   this._form.appendChild(this._file);  
   this._form.appendChild(this._button);  
  
   x=document.getElementById(this.reciever);  
   x.appendChild(this._form);  
  }  
  this.onClick=function(former){  
   return function(){sub_form(former);}  
  }  
  
}  
  
  
var CAjaxUploader = Class.create();  
CAjaxUploader.prototype.initialize=function(in_element){  
  this.htmlelement=in_element;  
  this.Iframes=new Array();  
  this.Uploads=new Array();  
  this.draw=function(Uploads,action){  
   for(var i=0;i<Uploads;++i){  
   this.Uploads[i]=new Array();  
   this.Uploads[i][0]=this.doIframe(i,action);  
   this.Uploads[i][1]=new CAjaxUploadForm("Form_" + i, this.htmlelement, action, this.Uploads[i][0]);  
   this.Uploads[i][1].make();  
  }  
  }  
  this.doIframe=function(id,action){  
   x=document.getElementById(this.htmlelement);  
   _iframe = document.createElement("IFRAME");  
   _iframe.id="IFRAME_" + id;  
   _iframe.name="IFRAME_" + id;  
   _iframe.src=action;  
   x.appendChild(_iframe);  
   return _iframe.id;  
  }  
  
}  
  
  
  
function sub_form(form){  
 x = document.getElementById(form);  
 x.submit();  
}  
  
</script>  
<body>  
<div id="UploadArea"></div>  
  
<script language="JavaScript">  
var Upload = new CAjaxUploader("UploadArea");  
Upload.draw(4,"recieve.php");  
  
</script>  
</body>  
</html>  

Wird vom Firefox einwandfrei ausgeführt, also das generierte formular wird abgesendet und im entsprechend generierten iframe verarbeitet, aber mein freund der internet explorer (v7) senden den post an target="_blank"...

hab noch eben opera gecheckt, der machts auch richtig

kann mir bitte einer ne erklärung geben warum der ie das macht bzw. wie ich den "fehler" umgehen kann ??

mfg
Freddy

  1. Hallo,

    this.doIframe=function(id,action){
       _iframe = document.createElement("IFRAME");
       _iframe.id="IFRAME_" + id;
       _iframe.name="IFRAME_" + id;

    ...

    }

    kann mir bitte einer ne erklärung geben warum der ie das macht bzw. wie ich den "fehler" umgehen kann ??

    ... könnte es mir so erklären:

    aus: http://msdn2.microsoft.com/en-us/library/ms534184(VS.85).aspx
    "The NAME attribute cannot be set at run time on elements dynamically created with the createElement method. "

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
    1. Hi,

      "The NAME attribute cannot be set at run time on elements dynamically created with the createElement method. "

      Und? Der folgende Satz lautet: "To create an element with a NAME attribute, include the attribute and value when using the createElement method."

      Und wenn man das macht (es empfiehlt sich Conditional Compilation zu verwenden), dann klappt's auch mit dem IE! =:-o

      Gruß, Cybaer

      --
      Man kann doch sehr leicht jenen tugendhaften Menschen begegnen, (...) die eine Art "unkrümmbaren Zeigefinger" besitzen, der ständig den kalten Wind des Rechthabens ausströmt. (Wolfgang Huber, Bischof)
      Die Tugend jagt nicht den Teufel, sondern den Sündhaften. Damit wird sie zum Terror. (Hans-Ulrich Jörges, Journalist)
      1. Danke für die schnellen und hilfreichen Antworten

        "The NAME attribute cannot be set at run time on elements dynamically created with the createElement method. "

        Und? Der folgende Satz lautet: "To create an element with a NAME attribute, include the attribute and value when using the createElement method."

        Nach dem veränderten Aufrug von createElement()
           ... = document.createElement("<iframe name='....' ....>");
        wird der iframe so in den DOM gehängt wie es sollte.

        Folgendes entwickelt sich aber auch beim FORM-Element (siehe org. thread)
        wenn ich versuche die attribute method und ectype so zu setzen :

        form.method="post";
           form.enctype=".....";

        erkennt der IE mal wieder nix, der request geht "über" den iframe aber keine
         $_POST bzw $_FILES werden übergeben, dies habe ich umgangen indem ich diese attribute ebenfalls mit createElement in einem Schwung setze, jetzt funktionierts.

        Also Fazit (für mich) :

        werden Element-Attribute vom IE nicht richtig gesetzt wenn ein Element erzeugt wird, versuche die Attribute beim erzeugen zu initialisieren.

        if(IE) document.createElement("<element attribute='...' ......>");

        1. Hi,

          Folgendes entwickelt sich aber auch beim FORM-Element (siehe org. thread)

          Welcher "org. thread" - machst du etwa Doppelpostings?

          wenn ich versuche die attribute method und ectype so zu setzen :

          form.method="post";
             form.enctype=".....";

          erkennt der IE mal wieder nix, der request geht "über" den iframe aber keine $_POST bzw $_FILES werden übergeben

          Das duerfte daran liegen, dass das Erzeugen der input-Elemente *im* Formular natuerlich wieder auf das gleiche Problem bzgl. name- (und type-)Attribute laeuft.

          MfG ChrisB

        2. Hallo,

          if(IE) document.createElement("<element attribute='...' ......>");

          hier noch ein Beispiel, wie es mit der von Cybaer genannten
          "conditional compilation" aussehen könnte: Tippsammlung

          Gruß plan_B

          --
               *®*´¯`·.¸¸.·