在專案中,常會遇到頁面分割,最常見的系統或網站的主介面。主頁分為,上面系統簡介、下方作者簡介、左邊系統功能選單、右邊則是選單真正展示的介面。
遇到這種這種分割頁面,大家首先想到是frameset,使用framset分割多種frame,這種方式簡單。若是不喜歡使用framset,喜歡前台設計的人也許會選擇p拼接,浮動,這就考查css樣式的功底了。
這次主要講解局部刷新的問題。需求是:左邊frame,右邊frame。
大家一定疑問,這樣刷新沒有問題。的確如此。現在使用framset,分割兩個frame,各自更新各自。右邊frame展示選單儘管更新提交即可。對左邊frame是沒有影響的。
為了方便理解,左邊Frame簡稱LeftFrame,右邊Frame簡稱RightFrame;假如我提交RightFrame頁面,需要更新LeftFrame【動態】頁面。那如何辦呢?
其實就是從資料庫重新讀取資料;
其中modifyMenu!showTreeMenu是轉向到tree.jsp頁面
現在專案中,前台使用struts2,當提交右邊頁面數據時,當時設想:然後再次跳到主介面,相當於重新讀取數據,但是加載的主介面竟然是顯示在右邊區域,這樣就成了兩個LeftFrame。即使更改Struts2中的resultType的重新導向也不可以。
最後,竟然一個簡單的JS解決問題。
在提交右邊頁面RightFrame,使用JS更新左邊LeftFrame。如下:
rightFrame中的body的onload的事件:
window.parent.frames[ "leftTree"].location.reload()
當時你在某一個思路上山窮水盡的時候,可以嘗試換種思路,也是會柳暗花明.
需求如下:若刷新右邊RightFrame頁面,只刷新部分左邊LeftFrame【刷新某個p】。
提到局部部分刷新,一定想到是Ajax局部刷新。
那我們用純js的Ajax基礎實作:
function init(){
//則進行局部刷新
var xmlHttpReq=createXmlHttpRequest();
//獲得出發的url的,例如struts2的action或servlet或jsp頁面
var url="success.jsp";
xmlHttpReq.open("GET",url,true);
//因為你在作一個非同步調用,
//所以你需要註冊一個XMLHttpRequest物件將呼叫的回呼事件處理器
xmlHttpReq.onreadystatechange=function(){
if(xmlHttpReq.readyState==4){
if(xmlHttpReq.status==200){
//使用parent取得左邊頁面中的某一個p,然後改變顯示的外觀
window.parent.frames["leftTree"].document.getElementById(pId).innerHTML="測試";
}else{
alert(xmlHttpReq.status+xmlHttpReq.responseText);
}
}
};
xmlHttpReq.send(null);
}
window.parent.frames["leftTree"].document.getElementById(pId).innerHTML=xmlHttpReq.responseText
後台action中的寫法如下:
兩種刷新方式,一種整體刷新;一種局部刷新;