首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP 表單 onsubmit 驗證失效:地址下拉框校驗繞過問題修復

     編輯:程式設計綜合問答

問題現象

  • 用戶名、密碼校驗正常攔截提交。
  • 省份/城市下拉框(`province`、`city`)未選擇時,仍能提交到 Servlet。
  • 即使 `check()` 全部 `return false`,表單仍提交。

根因分析

  1. 校驗函數 `checkUaddr` 未定義:代碼中調用 `checkUaddr(document.userform.province.value)` 但 JS 文件裡**只有 `checkUname`、`checkUpwd`、`checkUpwd2`**,缺少 `checkUaddr` 實現,導致 JS 拋錯、中斷執行,瀏覽器默認繼續提交。
  2. `onsubmit="return check()"` 寫法正確,但 `check()` 內部拋異常:調用未定義函數 → `ReferenceError` → `check()` 未返回 `false` → 表單提交。
  3. 下拉框 `onblur` 觸發時機:失焦才校驗,用戶可直接點提交按鈕繞過失焦事件。

修復方案

1. 補全 `checkUaddr` 函數

function checkUaddr(str) {
    if (str == "" || str == "請選擇所在省份" || str == "請選擇所在城市") {
        document.getElementById("uaddrErr").innerHTML = "地址不能為空";
        // 聚焦第一個下拉框
        document.userform.province.focus();
        return false;
    } else {
        document.getElementById("uaddrErr").innerHTML = "驗證通過";
        return true;
    }
}

2. 統一校驗入口,增強魯棒性

function check() {
    try {
        if (!checkUname(document.userform.uname.value)) return false;
        if (!checkUpwd(document.userform.upwd.value)) return false;
        if (!checkUpwd2(document.userform.upwd2.value)) return false;
        // 省份和城市至少選一個非默認值
        if (!checkUaddr(document.userform.province.value)) return false;
        if (!checkUaddr(document.userform.city.value)) return false;
        return true;
    } catch (e) {
        console.error("校驗異常:", e);
        alert("頁面腳本錯誤,請聯系管理員");
        return false; // 異常時攔截提交
    }
}

3. HTML 規範化

  • 給 `
    ` 添加 `novalidate` 禁用 HTML5 原生校驗,避免衝突。
  • 下拉框默認項 `` 確保 `value=""`,便於 JS 判斷。
  • 提交按鈕 `` 保持,不改 `button`,配合 `onsubmit` 最可靠。

進階優化

優化點實現
實時校驗`onchange` / `oninput` 即時提示,減少提交時挫折感
聯動校驗省份改變時重置城市,城市為空則禁用提交
防重複提交`check()` 內禁用提交按鈕 `btn.disabled=true`,AJAX 完成後恢復
服務端二次校驗**前端校驗只為體驗,後端必須再次校驗**,防繞過

調試技巧

  1. F12 開發者工具 → Console,查看紅色 `ReferenceError: checkUaddr is not defined`。
  2. Network 面板,觀察表單提交請求是否發出、狀態碼。
  3. 在 `check()` 首行加 `debugger;`,瀏覽器自動斷點,單步執行。

總結

表單 `onsubmit` 失效 99% 是 **JS 校驗函數缺失或拋異常導致中斷**。補全 `checkUaddr`、包裹 `try-catch` 返回 `false`、規範 HTML 結構,即可徹底解決。切記:**前端校驗不可信,後端必驗**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved