Web前端技术 · 第4课12 / 21 | 编码:L04-12
使用HTML创建表单

出错后,用户知道怎么改吗?

提示应说明字段、规则和修正办法,不能只有红色边框或“输入错误”。

<form id="demo">
<label for="contact">通知邮箱(必填)</label>
<input id="contact" name="email" type="email"
       required aria-describedby="mail-help feedback">
<p id="mail-help">用于接收场次通知,例如 mei@example.com。</p>
<p>
  <button type="button" data-value="">留空</button>
  <button type="button" data-value="mei">填入 mei</button>
  <button type="button" data-value="mei@example.com">填入邮箱示例</button>
</p>
<label for="mode">提示方式</label>
<select id="mode">
  <option value="vague">笼统提示</option>
  <option value="specific">具体提示</option>
</select>
<button type="button" id="check">检查填写</button>
<p id="feedback" role="status"></p>
</form>
<script>
const form = document.querySelector('#demo');
const mail = document.querySelector('#contact');
const mode = document.querySelector('#mode');
const feedback = document.querySelector('#feedback');
function clearFeedback() {
  feedback.textContent = '';
  mail.removeAttribute('aria-invalid');
}
form.addEventListener('submit', event => event.preventDefault());
mail.addEventListener('input', clearFeedback);
mode.addEventListener('change', clearFeedback);
form.querySelectorAll('[data-value]').forEach(button => {
  button.addEventListener('click', () => {
    mail.value = button.dataset.value;
    clearFeedback();
  });
});
document.querySelector('#check').addEventListener('click', () => {
  const valid = mail.checkValidity();
  mail.setAttribute('aria-invalid', String(!valid));
  if (valid) {
    feedback.textContent = '格式检查通过;尚未提交,未核实邮箱是否存在。';
  } else {
    feedback.textContent = mode.value === 'vague' ? '输入错误。'
      : mail.validity.valueMissing ? '通知邮箱未填写,请输入接收通知的邮箱。'
      : '通知邮箱格式不正确,请填写完整地址,例如 mei@example.com。';
    mail.focus();
  }
});
</script>

先填入 mei,分别选择两种提示方式并点击“检查填写”:哪一种能帮助用户定位和修正问题?再改为邮箱示例,观察提示是否仍准确区分“格式通过”和“提交成功”。

演示如何改变反馈

checkValidity() 判断约束是否通过;validity.valueMissing 区分“未填写”与本例的格式错误。textContent 更新提示,aria-invalid 标记错误状态,focus() 把焦点移回错误字段。输入改变时清除旧反馈,但不清空用户输入。这里使用 checkValidity 而非 reportValidity,避免浏览器气泡盖住两种自定义提示的对比。

解释规则

aria-describedby关联补充说明;label仍承担控件名称。

允许修正

保留合理的已填内容,不因一个字段错误清空整张表单。

说明状态

“格式检查通过”不是“已保存成功”。异步结果可用role="status"提示。

思考

用户输入符合邮箱格式,页面立即显示“报名成功”。这句话缺少什么证据?

展开参考分析

缺少服务端确认:是否接收、保存以及是否满足名额等业务条件。客户端只能据当前校验结果说明“格式检查通过”。