Skip to content

在表单校验场景中, 如何实现页面视口滚动到报错的位置

在表单校验场景中,当用户提交表单并发生验证错误时,通常需要将页面滚动到第一个报错的位置,以便用户能够清楚地看到并修正错误。

实现思路

  1. 在表单提交时进行验证:通过监听表单的提交事件或触发验证事件,进行表单的字段校验。
  2. 查找第一个错误的位置:遍历表单字段,找到第一个校验失败的字段,获取其位置。
  3. 滚动页面到错误位置:使用浏览器的 scrollIntoView() 方法将该字段滚动到视口可见区域。

具体实现步骤

  1. 定义一个表单:使用 HTML 创建表单,配合各个输入字段和校验提示。
  2. 验证表单:通过 JavaScript 校验表单字段的值。
  3. 滚动到第一个错误字段:当发现错误时,使用 scrollIntoView() 滚动到对应的输入框。

示例代码

假设有一个表单,包含多个输入框,需要进行简单的非空验证:

html
<form id="myForm">
  <div class="form-group">
    <label for="name">Name</label>
    <input type="text" id="name" name="name">
    <span class="error-message" id="nameError"></span>
  </div>
  
  <div class="form-group">
    <label for="email">Email</label>
    <input type="email" id="email" name="email">
    <span class="error-message" id="emailError"></span>
  </div>

  <div class="form-group">
    <label for="age">Age</label>
    <input type="number" id="age" name="age">
    <span class="error-message" id="ageError"></span>
  </div>

  <button type="submit">Submit</button>
</form>

JavaScript 代码

javascript
// 表单校验
function validateForm(event) {
  event.preventDefault();  // 阻止表单提交,避免页面刷新

  // 清空之前的错误信息
  const errorMessages = document.querySelectorAll('.error-message');
  errorMessages.forEach(msg => msg.textContent = '');

  // 获取表单字段
  const name = document.getElementById('name');
  const email = document.getElementById('email');
  const age = document.getElementById('age');

  let isValid = true;
  let firstErrorElement = null;

  // 校验每个字段
  if (name.value.trim() === '') {
    isValid = false;
    document.getElementById('nameError').textContent = 'Name is required.';
    firstErrorElement = firstErrorElement || name;  // 记录第一个错误字段
  }

  if (email.value.trim() === '') {
    isValid = false;
    document.getElementById('emailError').textContent = 'Email is required.';
    firstErrorElement = firstErrorElement || email;
  }

  if (age.value.trim() === '') {
    isValid = false;
    document.getElementById('ageError').textContent = 'Age is required.';
    firstErrorElement = firstErrorElement || age;
  }

  // 如果有错误,滚动到第一个错误字段
  if (!isValid && firstErrorElement) {
    firstErrorElement.scrollIntoView({
      behavior: 'smooth', // 平滑滚动
      block: 'center' // 滚动到视口中间
    });
  }

  return isValid;
}

// 绑定表单提交事件
const form = document.getElementById('myForm');
form.addEventListener('submit', validateForm);

代码解释

  1. 表单校验函数 validateForm:当表单提交时,首先阻止默认行为,防止页面刷新。然后,检查每个输入框的值是否为空。如果某个字段验证失败,就显示对应的错误信息,并记录第一个错误元素。

  2. scrollIntoView() 方法:如果校验失败,并且找到了第一个错误字段,通过 scrollIntoView() 方法将该元素滚动到视口中间。这里使用了 smooth 选项来实现平滑滚动效果。

  3. firstErrorElement:用于记录第一个报错的元素,确保滚动到第一个错误的位置。

  4. 错误信息显示:每个输入框旁边都有一个 span 元素用于显示相应的错误信息。

其他补充

  1. 滚动位置优化

    • 你可以调整 scrollIntoView()block 参数,以控制滚动时的对齐方式。常见的值有:
      • start:元素顶部与视口顶部对齐。
      • center:元素与视口中心对齐。
      • end:元素底部与视口底部对齐。
  2. 支持多个错误提示

    • 如果需要支持多个错误提示(例如,表单中的多个字段可能同时出错),你可以扩展逻辑,依次显示所有字段的错误信息,并滚动到第一个错误的字段。
  3. 兼容性

    • scrollIntoView() 方法在现代浏览器中得到了广泛的支持,但如果你需要兼容更旧的浏览器(如 IE),可能需要使用其他方法(例如:通过 window.scroll() 实现)。
  4. 自定义验证规则

    • 你可以根据业务需求扩展验证规则,如正则校验邮箱格式、密码强度检查等。