在前端开发中,表单处理非常常见。
无论是用户注册、登录,还是提交反馈等等,表单都是与用户交互的重要方式。
使用 JavaScript,可以实现实时验证、动态更新和异步提交等功能,用以提升用户体验。
典型的使用场景
常的使用场景有如下 5 种:
- 表单验证:确保用户输入的数据符合预期格式和要求。 
- 动态更新表单:根据用户的输入动态更新表单内容。 
- 提交表单数据:通过 AJAX 提交表单数据,而无需刷新页面。 
- 处理表单事件:处理各种表单事件,如 - focus、- blur、- change等。
 
- 防止重复提交:防止用户多次点击提交按钮导致表单重复提交。 
咱们通过一个具体的例子来分别讲述上述场景的使用。
假设我们现在有一个注册页面,要求用户输入邮箱,选择国家、城市。
<form id="registrationForm">   <label for="email">邮箱:</label>   <input     type="email"     id="email"     name="email"     oninvalid="this.setCustomValidity('邮箱地址不能为空,请输入有效的邮箱地址。')"     oninput="setCustomValidity('')"     required   />   <span id="emailError" class="error"></span><br />    <label for="country">选择国家:</label>   <select     id="country"     name="country"     oninvalid="this.setCustomValidity('国家不能为空,请选择国家')"     oninput="setCustomValidity('')"     required   >     <option value="">请选择国家</option>     <option value="China">中国</option>     <option value="USA">美国</option>     <option value="Canada">加拿大</option>   </select>   <span id="countryError" class="error"></span><br />    <label for="city">选择城市:</label>   <select     id="city"     name="city"     oninvalid="this.setCustomValidity('城市不能为空,请选择城市')"     oninput="setCustomValidity('')"     required   >     <option value="">请选择城市</option>   </select>   <span id="cityError" class="error"></span><br />    <button id="submitButton" type="submit">注册</button> </form> 
看一下实现的效果:

表单验证
为邮箱地址添加了一个验证,如果输入的字符串中不含有@符号,则有警告信息。
这一部分的实现则是通过添加 submit 事件的处理达成的。
document   .getElementById('registrationForm')   .addEventListener('submit', function (event) {     var isValid = true;      // 验证邮箱格式     var email = document.getElementById('email').value;     var emailError = document.getElementById('emailError');     if (!email.includes('@')) {       emailError.textContent = '请输入有效的邮箱地址';       isValid = false;     } else {       emailError.textContent = '';     }      // 验证国家选择     var country = document.getElementById('country').value;     var countryError = document.getElementById('countryError');     if (country === '') {       countryError.textContent = '请选择国家';       isValid = false;     } else {       countryError.textContent = '';     }      // 验证城市选择     var city = document.getElementById('city').value;     var cityError = document.getElementById('cityError');     if (city === '') {       cityError.textContent = '请选择城市';       isValid = false;     } else {       cityError.textContent = '';     }      // 如果验证不通过,阻止表单提交     if (!isValid) {       event.preventDefault();     }   }); 
这里不仅验证了邮箱,包括国家和城市的选择也都进行了验证。
动态更新表单
通过上述的例子,可能注意城市的信息是根据国家动态更新的,这一部分的动态更新的实现如下:
document.getElementById('country').addEventListener('change', function () {   var country = this.value;   var citySelect = document.getElementById('city');   citySelect.innerHTML = ''; // 清空之前的选项    var cities = {     China: ['北京', '上海', '广州', '深圳'],     USA: ['New York', 'Los Angeles', 'Chicago', 'Houston'],     Canada: ['Toronto', 'Vancouver', 'Montreal', 'Calgary'],   };    var defaultOption = document.createElement('option');   defaultOption.value = '';   defaultOption.textContent = '请选择城市';   citySelect.appendChild(defaultOption);    //添加其它城市作为选项   if (country && cities[country]) {     cities[country].forEach(function (city) {       var option = document.createElement('option');       option.value = city;       option.textContent = city;       citySelect.appendChild(option);     });   } }); 
提交表单数据
可以通过 XMLHttpRequest 或 fetch API 提交表单数据,而无需刷新页面。
这种方法通常用于异步提交表单数据(AJAX)。
document   .getElementById('registrationForm')   .addEventListener('submit', function (event) {     event.preventDefault(); // 阻止默认提交行为      var formData = new FormData(this);     //假设有一个页面为/submit,那么这里就是提交表单数据到这个页面进行处理。     fetch('/submit', {       method: 'POST',       body: formData,     })       .then((response) => response.json())       .then((data) => console.log(data))       .catch((error) => console.error('Error:', error));   }); 
处理表单事件
JavaScript 可以处理各种表单事件,如 focus、blur、change 等,以增强用户体验。
例如,当输入框获得焦点时显示提示信息,当输入框失去焦点时进行验证。
var input = document.getElementById('email');  //当输入框获得焦点时显示提示信息 input.addEventListener('focus', function () {   document.getElementById('hint').textContent = '请输入邮箱'; });  //当输入框失去焦点时检查用户名长度是否至少为 5 个字符。 input.addEventListener('blur', function () {   if (this.value.length < 5) {     alert('邮箱至少需要5个字符');   } }); 
防止重复提交
为了防止用户多次点击提交按钮导致表单重复提交,可以在提交表单后禁用提交按钮。
document   .getElementById('registrationForm')   .addEventListener('submit', function (event) {     var submitButton = document.getElementById('submitButton');     submitButton.disabled = true;   }); 
总结
前面已经看完了实现效果了,再看一版美化过的界面。

该文章在 2024/10/24 9:26:31 编辑过