在 `` 標籤或 `
<a href="default.jsp" onclick="checkUser()">點擊</a>
<script>
function checkUser() {
if (2 != 1) {
window.location.href = "login.jsp";
}
}
</script>
預期跳轉到 `login.jsp`,實際仍跳轉到 `default.jsp`(或表單提交)。
瀏覽器事件處理順序:
1. 執行 `onclick` 處理函數(設置 `location.href`)。
2. 繼續執行元素**預設行為**:`` 跳轉 `href`、`
window.event.returnValue = false (IE/舊版)function checkUser() {
if (2 != 1) {
window.location.href = "login.jsp";
window.event.returnValue = false; // 取消 a 標籤預設跳轉
}
}
缺點:非標準屬性,現代瀏覽器建議用 `event.preventDefault()`。
HTML:onclick="return checkUser();"
JS:
function checkUser() {
if (2 != 1) {
window.location.href = "login.jsp";
return false; // 告訴瀏覽器取消預設行為
}
return true; // 允許預設行為
}
原理:內聯事件處理函數返回 `false` 等同於 `event.preventDefault()` + `event.stopPropagation()`,阻止元素預設動作。
document.getElementById("myLink").addEventListener("click", function(e) {
if (condition) {
window.location.href = "login.jsp";
e.preventDefault(); // 標準 API 取消預設行為
}
});
| 場景 | 問題 | 修復 |
|---|---|---|
| <a onclick="fn()"> | fn 設置 location.href 後,a 預設跳轉覆蓋 | onclick="return fn()" + fn 返回 false |
| <form onsubmit="fn()"> | fn 設置 location.href 後,表單提交覆蓋 | onsubmit="return fn()" + fn 返回 false |
| addEventListener | 同上 | e.preventDefault() |