1. 程式人生 > >怎麼實現表單提交後不重新重新整理當前頁面

怎麼實現表單提交後不重新重新整理當前頁面

如何實現表單提交後不重新重新整理當前頁面

<form name='form1' id='form1' action='/xbcw/cw/xx_xx.action' method='post'>

  <input type="button" id="btnSubmit" name="btnSubmit" value="儲存" onclick="addKp()" class="Button2" />

  <input type="button" id="btnSubmit" name="btnSubmit" value="下一步" onclick="doAddCwKpSubmit()" class="Button2" />

</form>

當我點選儲存提交FORM表單後,如何讓當前頁面維持不變(即不重新整理當前頁)?

在FORM表單後新增一個iframe,即<form name='form1' id='form1' action='/xbcw/cw/xx_xx.action' method='post' target="rfFrame"
>

<iframe id="rfFrame" name="rfFrame" src="about:blank" style="display:none;"></iframe>

點儲存提交事件裡面需要將target改為iframe的名字:

  JS:document.forms[0].target="rfFrame";

       JQuery:$("#f2").attr("target","rfFrame");


這樣即提交了FORM儲存了資料,頁面也不會跳轉.

具體的原理是:form表單提交到iframe裡面處理,而這個iframe是隱藏的,所以提交表單的時候當前頁面沒有發生任何變化。form的target屬性指向iframe的name值,這樣就實現了提交到隱藏的iframe中。

那麼返回值應該怎麼獲取呢?

var frame1 = document.getElementById("frameFile1").contentDocument; //獲取到iframe裡面的
html元素

var frameJson1 = JSON.parse($(frame1).find('pre').html());
 //根據獲取到的元素進行相應的操作
這樣的話基本上可以模擬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>