使用用隱藏的 IFrame 提交表單開發的經驗總結

 Ajax雖然不錯,但無法上傳文件,可以用隱藏的 IFrame 提交表單部分替代Ajax。
原理如下:
1.寫一個Javascript類,動態添加一個IFrame。具體是在 document.body 對象中appendChild 如下結構:
<DIV id="i_frame_div">
  <IFrame id="i_frame" name="i_frame" width="1px" height="1px" style="display:none" src="inner.html"></IFrame>
</DIV>
這是通過Style的"display:none",來實現IFrame的不可見的;
不可以設成style="width:0px,height:0px,display:none",這樣會導致一些瀏覽器不添加IFrame
首先用DOM的方式生成<DIV>,然後使用:
  var i_div = document.getElementById("i_frame_div");
  i_div.innerHTML="<IFrame id=/"i_frame/" name=/"i_frame/" width=/"1px/" height=/"1px/" style=/"display:none/" src=/"inner.html/"></IFrame>";
的方式將IFrame嵌入頁面內;
注意,不要使用 DOM 的方式,這樣會導致通過 IE 的 DOM 樹不能正常獲得IFrame內前網頁的內容;
即不要採取如下形式:
  var i_frame=document.createElement("IFrame");
  i_frame.id="i_frame";
  ...
  var i_div = document.getElementById("i_frame_div");
  i_div.appendChild(i_frame);
這樣的代碼在<Form target="i_frame">提交時,IFrame的內嵌頁面inner.html在FireFox中會自動刷新。而IE 6.0 則會新彈出一個窗口;
src屬性必須指定一個空的html文件;

2.將這個類實例化爲一個全局變量,這個類的構造函數就寫成以上代碼;

3.寫一個<Form>, 注意:
將其屬性target指向IFrame的名稱,這樣提交後返回的目標頁面就會在IFrame中,而不被看見。
將提交按鈕改爲一般的Button :<INPUT type="button" onclick="func()">

4.爲以上類添加一個函數sendFileRequest(),參數放入Form的名稱和回調函數的指針,這樣就可以像表單中在提交前添加一些需要的變量,並且提交;

5.這裏注意一點,如果表單<Form>中不包含<Input type="file">這樣的元素的話,表單內容完全可以自動生成,例如可以通過函數sendFileRequest()進行構建,或在嵌入的頁中進行構建,然後把表單的各種值以Key=Value數組的形式傳入,藉此可以封裝成一個函數:
var form=document.createElement("Form");
...
但如果包含<Input type="file">的話,文件上傳時該tag的屬性value是文件的名稱,而此屬性是隻讀的不能被賦值:
var fileInput=document.createElement("Input");
fileInput.type="file";
fileInput.name="myName"
fileInput.value="myfile.txt" //此句會出錯
這是由於安全的原因,<Input type="file">不能被賦值;
這樣,表單必須做正常形式,target指向IFrame的name。

6.在以上的那個類中,再添加一個函數作爲回調函數getResponse(msg):
  getResponse:function(msg){
   this.responseText=msg;
   this.HandleResponse.call(this);
   //調用用戶傳入的回調函數
  }

7.服務器端程序的撰寫。主要是向IFrame提交一個可自動運行的網頁:
<HTML>
 <HEAD><TITLE></TITLE></HEAD>
 <BODY onload="doit();"></BODY>
 <SCRIPT LANGUAGE="JavaScript">
 <!--
  function doit(){
   parent.fileuploader.getResponse(msg);
   //調用回調函數
  }
 //-->
 </SCRIPT>
</HTML>

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章