• 34 【表单和FormData 对象】


    表单和FormData 对象

    1.FormData 对象

    1.1 概述

    表单数据以键值对的形式向服务器发送,这个过程是浏览器自动完成的。但是有时候,我们希望通过脚本完成这个过程,构造或编辑表单的键值对,然后通过脚本发送给服务器。浏览器原生提供了 FormData 对象来完成这项工作。

    FormData()首先是一个构造函数,用来生成表单的实例。

    var formdata = new FormData(form);
    
    • 1

    FormData()构造函数的参数是一个 DOM 的表单元素,构造函数会自动处理表单的键值对。这个参数是可选的,如果省略该参数,就表示一个空的表单。

    下面是一个表单。

    <form id="myForm" name="myForm">
      <div>
        <label for="username">用户名:</label>
        <input type="text" id="username" name="username">
      </div>
      <div>
        <label for="useracc">账号:</label>
        <input type="text" id="useracc" name="useracc">
      </div>
      <div>
        <label for="userfile">上传文件:</label>
        <input type="file" id="userfile" name="userfile">
      </div>
    <input type="submit" value="Submit!">
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    我们用FormData()处理上面这个表单。

    var myForm = document.getElementById('myForm');
    var formData = new FormData(myForm);
    
    // 获取某个控件的值
    formData.get('username') // ""
    
    // 设置某个控件的值
    formData.set('username', '张三');
    
    formData.get('username') // "张三"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.2 实例方法

    FormData 提供以下实例方法。

    • FormData.get(key):获取指定键名对应的键值,参数为键名。如果有多个同名的键值对,则返回第一个键值对的键值。
    • FormData.getAll(key):返回一个数组,表示指定键名对应的所有键值。如果有多个同名的键值对,数组会包含所有的键值。
    • FormData.set(key, value):设置指定键名的键值,参数为键名。如果键名不存在,会添加这个键值对,否则会更新指定键名的键值。如果第二个参数是文件,还可以使用第三个参数,表示文件名。
    • FormData.delete(key):删除一个键值对,参数为键名。
    • FormData.append(key, value):添加一个键值对。如果键名重复,则会生成两个相同键名的键值对。如果第二个参数是文件,还可以使用第三个参数,表示文件名。
    • FormData.has(key):返回一个布尔值,表示是否具有该键名的键值对。
    • FormData.keys():返回一个遍历器对象,用于for...of循环遍历所有的键名。
    • FormData.values():返回一个遍历器对象,用于for...of循环遍历所有的键值。
    • FormData.entries():返回一个遍历器对象,用于for...of循环遍历所有的键值对。如果直接用for...of循环遍历 FormData 实例,默认就会调用这个方法。

    下面是get()getAll()set()append()方法的例子。

    var formData = new FormData();
    
    formData.set('username', '张三');
    formData.append('username', '李四');
    formData.get('username') // "张三"
    formData.getAll('username') // ["张三", "李四"]
    
    formData.append('userpic[]', myFileInput.files[0], 'user1.jpg');
    formData.append('userpic[]', myFileInput.files[1], 'user2.jpg');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    下面是遍历器的例子。

    var formData = new FormData();
    formData.append('key1', 'value1');
    formData.append('key2', 'value2');
    
    for (var key of formData.keys()) {
      console.log(key);
    }
    // "key1"
    // "key2"
    
    for (var value of formData.values()) {
      console.log(value);
    }
    // "value1"
    // "value2"
    
    for (var pair of formData.entries()) {
      console.log(pair[0] + ': ' + pair[1]);
    }
    // key1: value1
    // key2: value2
    
    // 等同于遍历 formData.entries()
    for (var pair of formData) {
      console.log(pair[0] + ': ' + pair[1]);
    }
    // key1: value1
    // key2: value2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.表单的内置验证

    2.1 自动校验

    表单提交的时候,浏览器允许开发者指定一些条件,它会自动验证各个表单控件的值是否符合条件。

    <!-- 必填 -->
    <input required>
    
    <!-- 必须符合正则表达式 -->
    <input pattern="banana|cherry">
    
    <!-- 字符串长度必须为6个字符 -->
    <input minlength="6" maxlength="6">
    
    <!-- 数值必须在110之间 -->
    <input type="number" min="1" max="10">
    
    <!-- 必须填入 Email 地址 -->
    <input type="email">
    
    <!-- 必须填入 URL -->
    <input type="URL">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果一个控件通过验证,它就会匹配:valid的 CSS 伪类,浏览器会继续进行表单提交的流程。如果没有通过验证,该控件就会匹配:invalid的 CSS 伪类,浏览器会终止表单提交,并显示一个错误信息。

    input:invalid {
      border-color: red;
    }
    input,
    input:valid {
      border-color: #ccc;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 checkValidity()

    除了提交表单的时候,浏览器自动校验表单,还可以手动触发表单的校验。表单元素和表单控件都有checkValidity()方法,用于手动触发校验。

    // 触发整个表单的校验
    form.checkValidity()
    
    // 触发单个表单控件的校验
    formControl.checkValidity()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    checkValidity()方法返回一个布尔值,true表示通过校验,false表示没有通过校验。因此,提交表单可以封装为下面的函数。

    function submitForm(action) {
      var form = document.getElementById('form');
      form.action = action;
      if (form.checkValidity()) {
        form.submit();
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.3 setCustomValidity()

    控件元素的setCustomValidity()方法用来定制校验失败时的报错信息。它接受一个字符串作为参数,该字符串就是定制的报错信息。如果参数为空字符串,则上次设置的报错信息被清除。

    这个方法可以替换浏览器内置的表单验证报错信息,参数就是要显示的报错信息。

    <form action="somefile.php">
      <input
        type="text"
        name="username"
        placeholder="Username"
        pattern="[a-z]{1,15}"
        id="username"
      >
      <input type="submit">
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上面的表单输入框,要求只能输入小写字母,且不得超过15个字符。如果输入不符合要求(比如输入“ABC”),提交表单的时候,Chrome 浏览器会弹出报错信息“Please match the requested format.”,禁止表单提交。下面使用setCustomValidity()方法替换掉报错信息。

    var input = document.getElementById('username');
    input.oninvalid = function (event) {
      event.target.setCustomValidity(
        '用户名必须是小写字母,不能为空,最长不超过15个字符'
      );
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上面代码中,setCustomValidity()方法是在invalid事件的监听函数里面调用。该方法也可以直接调用,这时如果参数不为空字符串,浏览器就会认为该控件没有通过校验,就会立刻显示该方法设置的报错信息。

    /* HTML 代码如下
    

    */
    document.getElementById('fs').onchange = checkFileSize; function checkFileSize() { var fs = document.getElementById('fs'); var files = fs.files; if (files.length > 0) { if (files[0].size > 75 * 1024) { fs.setCustomValidity('文件不能大于 75KB'); return; } } fs.setCustomValidity(''); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    上面代码一旦发现文件大于 75KB,就会设置校验失败,同时给出自定义的报错信息。然后,点击提交按钮时,就会显示报错信息。这种校验失败是不会自动消除的,所以如果所有文件都符合条件,要将报错信息设为空字符串,手动消除校验失败的状态。

    2.4 表单的 novalidate 属性

    表单元素的 HTML 属性novalidate,可以关闭浏览器的自动校验。

    <form novalidate>
    form>
    
    • 1
    • 2

    这个属性也可以在脚本里设置。

    form.noValidate = true;
    
    • 1

    如果表单元素没有设置novalidate属性,那么提交按钮(

  • 相关阅读:
    ..\FreeRTOS\include\FreeRTOS.h(1277): error: #65: expected a “;“出现的这个错误标志解决方法
    docker错误集:CentOS环境
    状态机+策略在工单流转里的使用
    vue 的调试工具 vue-devtools 安装和配置
    ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)
    k3s 快速入门 - 集群搭建
    图像变形 -- 移动最小二乘法(MLS)
    SpringBoot项目--如何不停服更新应用?
    笔试强训day35(抄送列表,年会抽奖)
    CAD插入文件,使文件不跟随源对象而改变
  • 原文地址:https://blog.csdn.net/DSelegent/article/details/126543179