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

如何在输入框旁显示表单验证错误信息,替代alert弹窗且不使用jQuery

实现方案

第一步:修改HTML代码

移除所有输入框上的行内onkeypress事件,在每个需要验证的输入框/选择器后新增错误提示容器,示例片段如下:

<form action="https://mercury.swin.edu.au/it000000/formtest.php" method="post" id="regform">
  <p>Your Name: <span id="job1"></span></p>

  <label for="fname">First Name</label>
  <input type="text" id="fname" name="firstname" placeholder="Your name.." required="required" maxlength="25">
  <span id="fname-err" class="error-tip"></span>


  <label for="lname">Last Name</label>
  <input type="text" id="lname" name="lastname" placeholder="Your last name.." required="required">
  <span id="lname-err" class="error-tip"></span>

  <label for="start">Date of birth:</label>
  <input type="date" id="start" required="required" name="date of birth" value="2021-10-04" />
  <br>
  <br>
  <label for="gender"> Select you gender</label>
  <br>
  <br>
  <select name="gender" id="gender" required="required">
    <option value="" selected>Please Select</option>
    <option value="male">Male</option>
    <option value="female">Female</option>
  </select>
  <span id="gender-err" class="error-tip"></span>
  <br>
  <label for="streetname">Street Address</label>
  <input type="text" id="streetname" name="streetname" required="required" placeholder="Your street name..." maxlength="40" />
  <span id="streetname-err" class="error-tip"></span>
  <label for="suburb">Suburb/Town</label>
  <input type="text" id="suburb" name="suburb" required="required" placeholder="Your suburb/town..." maxlength="40">
  <span id="suburb-err" class="error-tip"></span>
  <label for="state">Choose a state:</label>
  <br>
  <select name="state" id="state" required="required">
    <option value="">Please Select</option>
    <option value="VIC">VIC</option>
    <option value="NSW">NSW</option>
    <option value="QLD">QLD</option>
    <option value="NT">NT</option>
    <option value="WA">WA</option>
    <option value="SA">SA</option>
    <option value="TAS">TAS</option>
    <option value="ACT">ACT</option>
  </select>
  <span id="state-err" class="error-tip"></span>
  <br>
  <br>
  <label for="postcode">Postcode</label>
  <input type="text" id="postcode" name="postcode" required="required" placeholder="Your postcode..." maxlength="4" minlength="4" pattern="^[0-9]{4}$">
  <span id="postcode-err" class="error-tip"></span>
  <label for="email">Email Address</label>
  <input type="text" id="email" name="emailadd" placeholder="Your email address.." required="required">
  <span id="email-err" class="error-tip"></span>
  <label for="phone">Phone Number</label>
  <input type="text" id="phone" name="phonenumb" placeholder="e.g. 0451124561" minlength="8" maxlength="12" required="required">
  <span id="phone-err" class="error-tip"></span>
  <br>
  <input type="submit" value="Apply">
  <br>
  <br>
  <input type="submit" id="cancelpurchase" value="Cancel Application">
</form>

第二步:添加错误提示样式

.error-tip {
  color: #f5222d;
  font-size: 12px;
  margin-left: 6px;
  display: none;
}

第三步:修改JS验证逻辑

// 清空所有错误提示
function clearAllErrors() {
  const errEls = document.querySelectorAll('.error-tip');
  errEls.forEach(el => {
    el.textContent = '';
    el.style.display = 'none';
  })
}

// 显示对应字段错误
function showFieldError(fieldId, msg) {
  const errEl = document.getElementById(`${fieldId}-err`);
  if(errEl) {
    errEl.textContent = msg;
    errEl.style.display = 'inline';
  }
}

// 替代行内按键过滤逻辑
['fname', 'lname'].forEach(id => {
  document.getElementById(id).addEventListener('keypress', function(e) {
    const code = e.charCode;
    return (code > 64 && code < 91) || (code > 96 && code < 123) || code ===32;
  })
})

// 绑定表单提交事件
document.getElementById('regform').addEventListener('submit', function(e) {
  const pass = validate();
  if(!pass) e.preventDefault();
})

// 修改后的验证函数
function validate() {
  clearAllErrors();
  var result = true;

  var fname = document.getElementById("fname").value;
  if (!fname.match(/^[a-zA-Z]+$/)) {
    showFieldError('fname', '请正确输入名字');
    result = false;
  }
  var lname = document.getElementById("lname").value;
  if (!lname.match(/^[a-zA-Z]+$/)) {
    showFieldError('lname', '请正确输入姓氏');
    result = false;
  }
  var email = document.getElementById("email").value;
  if (!email.match(/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/)) {
    showFieldError('email', '请正确输入邮箱地址');
    result = false;
  }
  var streetname = document.getElementById("streetname").value;
  if (!streetname.match(/^[a-zA-Z0-9\s]+$/)) {
    showFieldError('streetname', '请正确输入街道地址');
    result = false;
  }
  var suburb = document.getElementById("suburb").value;
  if (!suburb.match(/^[a-zA-Z\-]+$/)) {
    showFieldError('suburb', '请正确输入郊区/城镇名称');
    result = false;
  }
  var phone = document.getElementById("phone").value;
  if (!phone.match(/[0-9]{9}/)) {
    showFieldError('phone', '请正确输入手机号码');
    result = false;
  }

  var gender = document.getElementById("gender").value;
  var start = document.getElementById("start").value;
  // 注意原代码里skill、other、otherbox元素不存在,自行补充对应HTML即可
  // var skill = document.getElementById("skill").value;
  // var other = document.getElementById("other").value;
  // var otherbox = document.getElementById("otherbox").value;

  var postcode = document.getElementById("postcode").value;
  var state = document.getElementById("state").options[
    document.getElementById("state").selectedIndex
  ].text;

  var regex;
  switch (state) {
    case "Please Select":
      showFieldError('state', '请选择所在州');
      return false;
    case "VIC":
      regex = new RegExp(/(3|8)\d+/);
      break;
    case "NSW":
      regex = new RegExp(/(1|2)\d+/);
      break;
    case "QLD":
      regex = new RegExp(/(4|9)\d+/);
      break;
    case "NT":
      regex = new RegExp(/0\d+/);
      break;
    case "WA":
      regex = new RegExp(/6\d+/);
      break;
    case "SA":
      regex = new RegExp(/5\d+/);
      break;
    case "TAS":
      regex = new RegExp(/7\d+/);
      break;
    case "ACT":
      regex = new RegExp(/0\d+/);
      break;
  }
  if (!postcode.match(regex)) {
    showFieldError('postcode', '州和邮编不匹配');
    result = false;
  }

  if (result) {
    storeBooking(
      fname,
      lname,
      start,
      email,
      gender,
      phone,
      streetname,
      suburb,
      state,
      postcode,
      // other,
      // otherbox
    );
  }
  return result;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:39:03