Web前端技术 · 第 4 课预测 · 验证 · 解释
代码实验

看得见的值不一定进入字段清单

构造表单字段清单时,控件通常需要 name。disabled 控件被排除,readonly 不会因此被排除;没有勾选的复选框也不进入清单。“查看字段清单”按钮只把本地表单数据列出来,用于核对上述 HTML 规则,不发送报名请求。

先判断

保持初始状态,构造这张报名表的字段清单时,下面哪一项完整且正确?

<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>黄梅戏活动报名</title>
</head>
<body>
  <form id="signup">
    <p><label>昵称 <input id="alias" value="小梅"></label></p>
    <p><label>活动 <input name="event" value="opera" readonly></label></p>
    <p><label>地点 <input name="room" value="A208" disabled></label></p>
    <label><input type="checkbox" name="interest" value="singing" checked>唱腔</label>
    <label><input type="checkbox" name="interest" value="costume">服饰</label>
    <button type="button" id="inspect">查看字段清单</button>
  </form>
  <pre id="result"></pre>
  <script>
    document.querySelector('#inspect').addEventListener('click', () => {
      const fields = new FormData(document.querySelector('#signup'));
      document.querySelector('#result').textContent =
        [...fields].map(([name, value]) => name + '=' + value).join('\n');
    });
  </script>
</body>
</html>

再改一个条件

展开答案与分析

D。昵称只有 id,没有 name;地点被 disabled;服饰复选框没有勾选,因此这三项均被排除。活动只读但仍有 name,所以 event=opera 保留。清单由控件的名称和状态决定,不能只抄页面上所有能看见的文字。本例构造 FormData 时未手动追加字段,也未指定带 name 的提交按钮。

观察位置:运行后点击“查看字段清单”,将实际列出的字段逐项与 name、disabled、readonly 和勾选状态对照。末尾脚本只负责显示清单。