在基於 JSP 的傳統 Web 系統中,常使用 `
核心思路:**內層頁面提交前攔截 → 調用父頁面預定義的 JS 函數 → 父頁面執行 `window.location.href` 或修改 `main` iframe 的 `src` 實現整頁/區域跳轉。**
<%@ page contentType="text/html;charset=UTF-8" %>
<script type="text/javascript">
// 表單提交事件綁定 (推薦用 jQuery 或原生 addEventListener)
function submitFormAndRedirect() {
// 1. 獲取表單數據 (示例:隱藏域值)
var paramValue = document.getElementById('hiddenParam').value;
// 或 $('#hiddenParam').val();
// 2. 關鍵:調用父頁面暴露的全局函數,傳遞參數
// 父頁面必須定義 handleIframeSubmit(value) 函數
if (window.parent && window.parent.handleIframeSubmit) {
window.parent.handleIframeSubmit(paramValue);
} else {
alert("父頁面未定義處理函數,無法完成跳轉");
// 降級:普通提交
document.getElementById('myForm').submit();
}
return false; // 阻止默認提交行為
}
</script>
<form id="myForm" action="submit.do" method="post" onsubmit="return submitFormAndRedirect()">
<input type="hidden" id="hiddenParam" name="param" value="<%=request.getAttribute("value")%>" />
<!-- 其他表單字段 -->
<input type="submit" value="提交並跳轉" />
</form>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<script type="text/javascript">
// 父頁面暴露的全局處理函數
function handleIframeSubmit(paramValue) {
// 方案 A: 整頁跳轉 (刷新整個瀏覽器窗口)
// window.location.href = 'result.do?param=' + encodeURIComponent(paramValue);
// 方案 B: 僅刷新主內容區 iframe (常見於左側菜單+右側內容布局)
// 假設主內容區 iframe id="mainContent"
var mainFrame = document.getElementById('mainContent');
if (mainFrame) {
mainFrame.src = 'result.do?param=' + encodeURIComponent(paramValue);
} else {
// 兜底:整頁跳轉
window.location.href = 'result.do?param=' + encodeURIComponent(paramValue);
}
}
</script>
</head>
<body>
<div id="header">頁頭</div>
<div id="container">
<iframe id="menuFrame" src="menu.jsp" name="menu"></iframe>
<iframe id="mainContent" src="welcome.jsp" name="main"></iframe>
</div>
<!-- 內層 b.jsp 可能嵌在 mainContent 中,或作為彈窗內容 -->
</body>
</html>
若使用 `
<!-- Struts2 示例 -->
<s:form id="editForm" action="saveAction" onsubmit="return submitFormAndRedirect()">
<s:hidden id="hiddenParam" name="key" value="%{keyValue}" />
<s:submit value="保存" />
</s:form>
// 頁面層級結構
window.top (最頂層窗口,通常即主瀏覽器標籤頁)
└── window (a.jsp - 外層頁面)
├── window.parent (對 b.jsp 而言,指向 a.jsp 的 window)
└── iframe (b.jsp - 內層頁面)
└── window (b.jsp 自身)
├── window.parent === a.jsp 的 window
└── window.top === 瀏覽器頂層窗口
window.parent:直接父幀窗口對象。window.top:頂層祖先窗口對象(跨多層 iframe 時用)。| 問題 | 原因 | 解決 |
|---|---|---|
| 父頁面函數未定義報錯 | JS 加載順序、拼寫錯誤、父頁面未加載完成 | 在父頁面 `` 定義函數;內層調用前判斷 `if (window.parent.handleIframeSubmit)` |
| 表單仍在 iframe 內跳轉 | 未阻止默認提交 (`return false` 缺失) | `onsubmit="return submitFormAndRedirect()"` 且函數返回 `false` |
| 中文參數亂碼 | URL 編碼缺失 | JS 端 `encodeURIComponent()`,Java 端 `URLDecoder.decode(str, "UTF-8")` |
| 跨域訪問被拒 | 父子頁面域名/端口不同 | 使用 `window.postMessage(data, targetOrigin)` 進行安全跨域通信 |