You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML表单required校验失效 空值仍经XMLHttpRequest提交问题排查

问题根因
  • 事件绑定位置错误:你把提交逻辑绑在了提交按钮的onclick事件上,而HTML原生的required属性校验,只会在表单触发原生submit事件前执行,点击按钮时校验逻辑还未运行,你的AJAX请求就已经发送了。
  • 事件流被打断:你在按钮的onclick里写了return false,直接截断了表单原生事件流,导致浏览器内置的必填校验完全没有执行机会。
  • 事件对象使用不规范:直接在函数内调用全局event对象的写法兼容性差,且你没有判断表单校验结果,无论字段是否为空都会执行AJAX发送逻辑。
  • 额外小问题:代码中第一个表单标签拼写错误,把label写成了lable,会导致点击"User ID"文字无法聚焦到对应输入框。
修复方法

不要监听按钮点击事件,改为监听表单的submit事件,先阻止表单默认的同步跳转行为,再调用表单原生的checkValidity()方法判断必填项校验是否通过,校验通过后再发送AJAX请求。
修正后的完整代码如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>first assignment</title>
  </head>
  <body>
    <div class="somebox"></div>
    <ul>
      <h3>Team 1 Online Exam System</h3>
    </ul>
    <!-- 给表单加id,移除按钮上的onclick绑定 -->
    <form id="loginForm" action="" method="POST">
      <div name="form header" class="formhead">
        <h1>Welcome</h1>
        <p><span id="loginerr" class="err_alert"></span></p>
      </div>
      <div class="login_box">
        <!-- 修正lable拼写错误为label -->
        <label for="user_id">User ID</label>
        <input type="text" placeholder="Enter User ID" id="user_id" required>

        <label for="password">Password</label>
        <input type="password" placeholder="Enter Password" id="password" required>

        <button id="but" type="submit">Login</button>
      </div>
    </form>
    <div class="footer"></div>

    <script>
      // 监听表单submit事件,传入事件对象e
      document.getElementById('loginForm').addEventListener('submit', function(e) {
        // 阻止表单默认同步提交跳转
        e.preventDefault();
        // 先执行原生表单校验,校验不通过直接终止逻辑
        if (!this.checkValidity()) {
          return;
        }
        // 校验通过后再取参数发AJAX
        var user_id = document.getElementById("user_id").value;
        var pass = document.getElementById("password").value;
        var xmlhttp = new XMLHttpRequest();
        var theUrl = "/submit_test";
        xmlhttp.open("POST", theUrl);
        xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                console.log("success");
            }
        }
        xmlhttp.send(JSON.stringify({ "ProgMode": user_id, "pass": pass }));
      })
    </script>
  </body>
</html>
修复后效果
  • 必填项为空时,浏览器会自动弹出原生的必填提示,不会发送AJAX请求
  • 所有必填项填写完成后,才会通过XMLHttpRequest发送JSON格式的表单数据
  • 修正了label拼写问题,点击对应文字可以正常聚焦输入框

内容的提问来源于stack exchange,提问作者Mehmet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:24:40