2025-04-03 日报 Day145

2025-04-03 日报 Day145

Yuyang 前端小白🥬

今日的鸡汤

往后岁月,愿你摆正自己,见天地之大、众生之广,行稳致远,活出精彩人生。

今日学习内容

1、JS 红皮书 P591-596 第十九章:表单脚本

今日笔记

1、表单基础: Web 表单在 HTML 中以

元素表示,在 JavaScript 中则以 HTMLFormElement 类型表示。HTMLFormElement 类型继承自 HTMLElement 类型,因此拥有与其他 HTML 元素一样的默认属性。不过,HTMLFormElement 也有自己的属性和方法。
 acceptCharset:服务器可以接收的字符集,等价于 HTML 的 accept-charset 属性。
 action:请求的 URL,等价于 HTML 的 action 属性。
 elements:表单中所有控件的 HTMLCollection。
 enctype:请求的编码类型,等价于 HTML 的 enctype 属性。
 length:表单中控件的数量。
 method:HTTP 请求的方法类型,通常是”get”或”post”,等价于 HTML 的 method 属性。
 name:表单的名字,等价于 HTML 的 name 属性。
 reset():把表单字段重置为各自的默认值。
 submit():提交表单。
 target:用于发送请求和接收响应的窗口的名字,等价于 HTML 的 target 属性。

  • 提交表单: 表单是通过用户点击提交按钮或图片按钮的方式提交的。提交按钮可以使用 type 属性为”submit”的
1
2
3
4
5
6
<!-- 通用提交按钮 -->
<input type="submit" value="Submit Form" />
<!-- 自定义提交按钮 -->
<button type="submit">Submit Form</button>
<!-- 图片按钮 -->
<input type="image" src="graphic.gif" />

以这种方式提交表单会在向服务器发送请求之前触发 submit 事件。这样就提供了一个验证表单数据的机会,可以根据验证结果决定是否真的要提交。阻止这个事件的默认行为可以取消提交表单。例如,下面的代码会阻止表单提交:

1
2
3
4
5
let form = document.getElementById("myForm");
form.addEventListener("submit", (event) => {
// 阻止表单提交
event.preventDefault();
});

调用 preventDefault()方法可以阻止表单提交。通常,在表单数据无效以及不应该发送到服务器时可以这样处理。
当然,也可以通过编程方式在 JavaScript 中调用 submit()方法来提交表单。可以在任何时候调用这个方法来提交表单,而且表单中不存在提交按钮也不影响表单提交。下面是一个例子:

1
2
3
let form = document.getElementById("myForm");
// 提交表单
form.submit();

通过 submit()提交表单时,submit 事件不会触发。因此在调用这个方法前要先做数据验证。
表单提交的一个最大的问题是可能会提交两次表单。如果提交表单之后没有什么反应,那么没有耐心的用户可能会多次点击提交按钮。结果是很烦人的(因为服务器要处理重复的请求),甚至可能造成损失(如果用户正在购物,则可能会多次下单)。解决这个问题主要有两种方式:在表单提交后禁用提交按钮,或者通过 onsubmit 事件处理程序取消之后的表单提交。

  • 重置表单: 用户单击重置按钮可以重置表单。重置按钮可以使用 type 属性为”reset”的
1
2
3
4
<!-- 通用重置按钮 -->
<input type="reset" value="Reset Form" />
<!-- 自定义重置按钮 -->
<button type="reset">Reset Form</button>

这两种按钮都可以重置表单。表单重置后,所有表单字段都会重置回页面第一次渲染时各自拥有的值。如果字段原来是空的,就会变成空的;如果字段有默认值,则恢复为默认值。
用户单击重置按钮重置表单会触发 reset 事件。这个事件为取消重置提供了机会。例如,以下代码演示了如何阻止重置表单:

1
2
3
4
let form = document.getElementById("myForm");
form.addEventListener("reset", (event) => {
event.preventDefault();
});

与表单提交一样,重置表单也可以通过 JavaScript 调用 reset()方法来完成,如下面的例子所示

1
2
3
let form = document.getElementById("myForm");
// 重置表单
form.reset();

与 submit()方法的功能不同,调用 reset()方法会像单击了重置按钮一样触发 reset 事件。

  • 表单字段: 表单元素可以像页面中的其他元素一样使用原生 DOM 方法来访问。此外,所有表单元素都是表单 elements 属性(元素集合)中包含的一个值。这个 elements 集合是一个有序列表,包含对表单中所有字段的引用,包括所有之间,如下所示:
    1
    <textarea rows="25" cols="5">initial value</textarea>
    • 选择文本: 两种文本框都支持一个名为 select()的方法,此方法用于全部选中文本框中的文本。
    1
    2
    3
    4
    5
    6
    let textbox = document.forms[0].elements["textbox1"];
    textbox.select();

    textbox.addEventListener("focus", (event) => {
    event.target.select();
    });

    1、Select 事件: 当选中文本框中的文本时,会触发 select 事件。

    1
    2
    3
    4
    let textbox = document.forms[0].elements["textbox1"];
    textbox.addEventListener("select", (event) => {
    console.log("Text selected: " + event.target.value);
    });

    2、取得选中文本: 虽然 select 事件能够表明有文本被选中,但不能提供选中了哪些文本的信息。HTML5 对此进行了扩展,以方便更好地获取选中的文本。扩展为文本框添加了两个属性:selectionStart 和 selectionEnd。

    1
    2
    3
    function getSelectedText(textbox) {
    return textbox.value.substring(textbox.selectionStart, textbox.selectionEnd);
    }

    3、部分选中文本: setSelectionRange()方法也可以在所有文本框中使用。这个方法接收两个参数:要选择的第一个字符的索引和停止选择的字符的索引(与字符串的 substring()方法一样)。下面是几个例子:

    1
    2
    3
    4
    5
    6
    7
    textbox.value = "Hello world!";
    // 选择所有文本
    textbox.setSelectionRange(0, textbox.value.length); // "Hello world!"
    // 选择前 3 个字符
    textbox.setSelectionRange(0, 3); // "Hel"
    // 选择第 4~6 个字符
    textbox.setSelectionRange(4, 7); // "o w"

    4、自动切换: JavaScript 可以通过很多方式来增强表单字段的易用性。最常用的是在当前字段完成时自动切换到下一个字段。对于要收集数据的长度已知(比如电话号码)的字段是可以这样处理的。在美国,电话号码通常分为 3 个部分:区号、交换局号,外加 4 位数字。在网页中,可以通过 3 个文本框来表示这几个部分,比如:

    1
    2
    3
    <input type="text" name="tel1" id="txtTel1" maxlength="3" />
    <input type="text" name="tel2" id="txtTel2" maxlength="3" />
    <input type="text" name="tel3" id="txtTel3" maxlength="4" />

    为增加这个表单的易用性并加速数据输入,可以在每个文本框输入到最大允许字符数时自动把焦点切换到下一个文本框。因此,当用户在第一个文本框中输入 3 个字符后,就把焦点移到第二个文本框,当用户在第二个文本框中输入 3 个字符后,把焦点再移到第三个文本框。这种自动切换文本框的行为可以通过如下代码实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <script>
    function tabForward(event) {
    let target = event.target;
    if (target.value.length == target.maxLength) {
    let form = target.form;
    for (let i = 0, len = form.elements.length; i < len; i++) {
    if (form.elements[i] == target) {
    if (form.elements[i + 1]) {
    form.elements[i + 1].focus();
    }
    return;
    }
    }
    }
    }
    let inputIds = ["txtTel1", "txtTel2", "txtTel3"];
    for (let id of inputIds) {
    let textbox = document.getElementById(id);
    textbox.addEventListener("keyup", tabForward);
    }
    let textbox1 = document.getElementById("txtTel1");
    let textbox2 = document.getElementById("txtTel2");
    let textbox3 = document.getElementById("txtTel3");
    </script>

    5、HTML5为浏览器新增了在提交表单前验证数据的能力。这些能力实现了基本的验证,即使JavaScript不可用或加载失败也没关系。

    • 必填字段: 第一个条件是给表单字段添加 required 属性,如下所示: 任何带有 required 属性的字段都必须有值,否则无法提交表单。
    • 更多输入类型: HTML5 为元素增加了几个新的 type 值。这些类型属性不仅表明了字段期待的数据类型,而且也提供了一些默认验证,其中两个新的输入类型是已经得到广泛支持的”email”和”url”,二者都有浏览器提供的自定义验证。比如: "email"类型确保输入的文本匹配电子邮件地址,而"url"类型确保输入的文本匹配 URL。
    • 数值范围: 除了”email”和”url”,HTML5 还定义了其他几种新的输入元素类型,它们都是期待某种数值输入的,包括:”number”、”range”、”datetime”、”datetime-local”、”date”、”month”、”week”和”time”。
      对上述每种数值类型,都可以指定 min 属性(最小可能值)、max 属性(最大可能值),以及 step属性(从 min 到 max 的步长值)。例如,如果只允许输入 0 到 100 中 5 的倍数,那么可以这样写:
    • 输入模式: HTML5 为文本字段新增了 pattern 属性。这个属性用于指定一个正则表达式,用户输入的文本必须与之匹配。例如,要限制只能在文本字段中输入数字,可以这样添加模式: 注意模式的开头和末尾分别假设有^和$。这意味着输入内容必须从头到尾都严格与模式匹配。
    • 检测有效性: 使用 checkValidity()方法可以检测表单中任意给定字段是否有效。这个方法在所有表单元素上都可以使用,如果字段值有效就会返回 true,否则返回 false。
    • 禁用验证: 通过指定 novalidate 属性可以禁止对表单进行任何验证:
    • 这个值也可以通过 JavaScript 属性 noValidate 检索或设置,设置为 true 表示属性存在,设置为false 表示属性不存在: document.forms[0].noValidate = true; // 关闭验证
此页目录
2025-04-03 日报 Day145