正在加载...

JavaScript 表单

茶柜台有一张单子。表单是 #slip。里面有文本框 #guest,name 也是 guest;数字框 #cups,name 也是 cups;还有按钮 #send,type="submit"。下面的 #note 还写着 blank。
表单把带名字的字段收在一起。写下的内容在 value 里,即使用了 type number,它也始终是字符串。提交是表单上的 submit 事件。不调用 preventDefault,浏览器就会打开表单的地址,这一页就走了。这张单子调用 preventDefault,所以说明还能读。页面把客人写成 lida,把杯数写成 2,点一次 send,这一行变成 lida / 2 / stayed。

这不是票条

票条在父元素上放了一个点击监听,读取 event.target。那一行是 red / blue / gold / 1,没有 preventDefault。铭牌那一页在链接上调用了它。那一行是 click / seal / plaque / true / quiet。这张单子两者都不是。没有 gold 按钮,也没有 currentTarget。事件名叫 submit。要紧的是 lida 和字符串 2。
getElementById("guest") 用 id 找到字段。slip.elements.guest 用 name,经由表单找到它。这里 id 和 name 是同一个词。后面的课才检查空字段。这一页不检查。空的客人也会被送出。

单子记下什么

说明从 blank 开始。客人和杯数一开始是空的。按钮文字一直是 send。按顺序读每一行。除了页面那一行,每段都从空白单子开始。页面那一行是底部的演示。演示只点一次 send。

📊 单子记下什么

时刻 你读到什么 说明 容易混
客人写成 lida guest.value lida 去读 id guest
杯数写成 2 cups.value 2,而且是字符串 以为是数字 2
点击 send,函数写入 stayed 说明 stayed 调用 slip.submit(),它会跳过监听
两个名字,经由表单 elements.guest 和 elements.cups lida 2 去读 elements.slip
页面脚本 这一行 lida / 2 / stayed red / blue / gold / 1

value 不会把数字框变成数字。存入 2 之后,cups.value 是字符 2。typeof cups.value 是 "string"。以后若要数字,你自己转换。这一行不做这件事。
send.click() 会触发 submit,因为按钮的 type 是 submit。slip.submit() 是另一次调用。它把表单发出去,却不运行你的 submit 监听,里面的 preventDefault 根本轮不到。这一页用的是点击。

到同一字段的两条路

getElementById("cups") 用 id。slip.elements.cups 用 name,而且你得先拿到表单。这里两个属性是同一个词。如果 name 是 count、id 仍是 cups,就没有 elements.cups,字段会在 elements.count 上。

客人的名字

字段开始是空的。脚本把 lida 放进 value,再把同一属性读回说明。这时还没有提交。

Read the guest

javascript
let guest = document.getElementById("guest");
let note = document.getElementById("note");
guest.value = "lida";
note.textContent = guest.value;
console.log(note.textContent);

记录是 lida。id 是 guest。说明不是 guest 这个词。它是 value 里的那段文字。

几杯

换一张空白单。杯数字段是 type="number"。存入 2,读取 value,再问 typeof。

Read the cups as text

javascript
let cups = document.getElementById("cups");
let note = document.getElementById("note");
cups.value = "2";
note.textContent = cups.value + " " + typeof cups.value;
console.log(note.textContent);

记录是 2 string。格子看起来像数字,脚本拿到的是文字。不带引号存入数字 2,属性仍会以字符串 "2" 回来。

提交按钮

再换一张空白单。监听在表单上,听的是 submit。它调用 preventDefault 并写入 stayed。然后页面点击 send。它不调用 slip.submit()。

Stay on the page

javascript
let slip = document.getElementById("slip");
let note = document.getElementById("note");
function pour(event) {
event.preventDefault();
note.textContent = "stayed";
}
slip.addEventListener("submit", pour);
document.getElementById("send").click();
console.log(note.textContent);

记录是 stayed。监听运行了,浏览器没有离开这一页。若改成调用 slip.submit(),pour 不会运行。说明仍是 blank。

单子上的名字

空白单,这次没有监听。脚本通过 slip.elements 和 name 写入两个字段,再在说明里接起来。

Read both names

javascript
let slip = document.getElementById("slip");
let note = document.getElementById("note");
slip.elements.guest.value = "lida";
slip.elements.cups.value = "2";
note.textContent = slip.elements.guest.value + " " + slip.elements.cups.value;
console.log(note.textContent);

记录是 lida 2。elements.guest 是 name 为 guest 的输入框,不是 id 为 slip 的元素。空格只是说明里的分隔。页面那一行稍后用 /。

单子下面的那一行

脚本在 body 末尾,表单和段落之后。mark 起初是 left。监听阻止默认提交,把两个值抄进说明,并把 mark 设为 stayed。然后填上 lida 和 2,点一次 send。这一行在那次点击之后写出。

Page demo — tea slip

html
<!DOCTYPE html>
<html>
<head>
<title>forms — page</title>
</head>
<body>
<form id="slip">
<input id="guest" name="guest" type="text">
<input id="cups" name="cups" type="number">
<button id="send" type="submit">send</button>
</form>
<p id="note">blank</p>
<p id="line">…</p>
<script>
let slip = document.getElementById("slip");
let note = document.getElementById("note");
let mark = "left";
function pour(event) {
event.preventDefault();
note.textContent =
slip.elements.guest.value + " / " + slip.elements.cups.value;
mark = "stayed";
}
slip.addEventListener("submit", pour);
slip.elements.guest.value = "lida";
slip.elements.cups.value = "2";
document.getElementById("send").click();
document.getElementById("line").textContent =
note.textContent + " / " + mark;
</script>
</body>
</html>

这一行是 lida / 2 / stayed。第一个词是客人,第二个是作为文字的杯数,最后一个是 mark。监听运行了,所以是 stayed 而不是 left。说明停在 lida / 2。blank 不见了。票条那一行是另一页。这张单子不检查字段是否已填。

在柜台

  1. 在客人字段写入 lida,读取 value。说明是 lida。
  2. 在杯数写入 2,连同 typeof 读取 value。说明是 2 string。
  3. 监听 submit,调用 preventDefault,点击 send。说明是 stayed。
  4. 用 slip.elements 读取两个字段。然后看页面那一行:lida / 2 / stayed。

柜台上的岔路

标签仍是 guest、cups 和 send。说明不是 slip 这个词。

  • 把 cups.value 当成数字 2
  • 调用 slip.submit() 却等着 pour 运行
  • 忘了 preventDefault,浏览器就去打开地址
  • 想要 value 却读了 id guest
  • 去找 slip.elements.slip
  • 在这一页检查空字段或格式
  • 把这一行读成 red / blue / gold / 1

留下这些

  • 写入 lida 之后,guest.value 就是 lida
  • cups.value 是字符串 2,typeof 是 "string"
  • send.click() 会运行 submit 监听;slip.submit() 不会
  • 页面还在、说明能写出 stayed,是因为 preventDefault
  • slip.elements.guest 和 slip.elements.cups 读取带名字的字段
  • 页面那一行是 lida / 2 / stayed

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
7
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部