FormData

1. 概述

FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。

2. 构造函数

创建一个formData对象实例有几种方式

1、创建一个空对象实例

var formData = new FormData();

此时可以调用append()方法来添加数据

2、使用已有的表单来初始化一个对象实例

假如现在页面已经有一个表单

名字
密码

" title="" data-original-title="复制">

<form id="myForm" action="" method="post">
<input type="text" name="name">名字
<input type="password" name="psw">密码
<input type="submit" value="提交">
</form>

我们可以使用这个表单元素作为初始化参数,来实例化一个formData对象

// 获取页面已有的一个form表单
var form = document.getElementById("myForm");
// 用表单来初始化
var formData = new FormData(form);
// 我们可以根据name来访问表单中的字段
var name = formData.get("name"); // 获取名字
var psw = formData.get("psw"); // 获取密码
// 当然也可以在此基础上,添加其他数据
formData.append("token","kshdfiwi3rh");

3. 操作方法

首先,我们要明确formData里面存储的数据形式,一对key/value组成一条数据,key是唯一的,一个key可能对应多个value。如果是使用表单初始化,每一个表单字段对应一条数据,它们的HTML name属性即为key值,它们value属性对应value值。

key value
k1 [v1,v2,v3]
k2 v4

3.1 获取值

我们可以通过get(key)/getAll(key)来获取对应的value,

formData.get("name"); // 获取key为name的第一个值
formData.get("name"); // 返回一个数组,获取key为name的所有值

3.2 添加数据

我们可以通过append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾

formData.get("k1"); // "v1"

formData.getAll("k1"); // ["v1","v2","v1"]" title="" data-original-title="复制">


formData.append("k1", "v1");

formData.append("k1", "v2");

formData.append("k1", "v1"); formData.get("k1"); // "v1"

formData.getAll("k1"); // ["v1","v2","v1"]

3.3 设置修改数据

我们可以通过set(key, value)来设置修改数据,如果指定的key不存在则会新增一条,如果存在,则会修改对应的value值。

formData.append("k1", "v1");
formData.set("k1", "1");
formData.getAll("k1"); // ["1"]

3.4 判断是否该数据

我们可以通过has(key)来判断是否对应的key值

formData.has("k1"); // true

formData.has("k2"); // true

formData.has("k3"); // false" title="" data-original-title="复制">


formData.append("k1", "v1");

formData.append("k2",null); formData.has("k1"); // true

formData.has("k2"); // true

formData.has("k3"); // false

3.5 删除数据

通过delete(key),来删除数据

formData.getAll("k1"); // []" title="" data-original-title="复制">


formData.append("k1", "v1");

formData.append("k1", "v2");

formData.append("k1", "v1");

formData.delete("k1"); formData.getAll("k1"); // []

3.6 遍历

我们可以通过entries()来获取一个迭代器,然后遍历所有的数据,

var i = formData.entries();

i.next(); // {done:false, value:["k1", "v1"]}

i.next(); // {done:fase, value:["k1", "v2"]}

i.next(); // {done:fase, value:["k2", "v1"]}

i.next(); // {done:true, value:undefined}" title="" data-original-title="复制">


formData.append("k1", "v1");

formData.append("k1", "v2");

formData.append("k2", "v1"); var i = formData.entries(); i.next(); // {done:false, value:["k1", "v1"]}

i.next(); // {done:fase, value:["k1", "v2"]}

i.next(); // {done:fase, value:["k2", "v1"]}

i.next(); // {done:true, value:undefined}

可以看到返回迭代器的规则

  1. 每调用一次next()返回一条数据,数据的顺序由添加的顺序决定

  2. 返回的是一个对象,当其done属性为true时,说明已经遍历完所有的数据,这个也可以作为判断的依据

  3. 返回的对象的value属性以数组形式存储了一对key/value,数组下标0为key,下标1为value,如果一个key值对应多个value,会变成多对key/value返回

我们也可以通过values()方法只获取value值

var i = formData.entries();

i.next(); // {done:false, value:"v1"}

i.next(); // {done:fase, value:"v2"}

i.next(); // {done:fase, value:"v1"}

i.next(); // {done:true, value:undefined}" title="" data-original-title="复制">


formData.append("k1", "v1");

formData.append("k1", "v2");

formData.append("k2", "v1"); var i = formData.entries(); i.next(); // {done:false, value:"v1"}

i.next(); // {done:fase, value:"v2"}

i.next(); // {done:fase, value:"v1"}

i.next(); // {done:true, value:undefined}

4. 发送数据

我们可以通过xhr来发送数据

var xhr = new XMLHttpRequest();
xhr.open("post","login");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(formData);

这种方式可以来实现文件的异步上传。

参考

  1. 兼容性查询

  2. MDN

  3. 《JavaScript高级程序设计》

            </div>

系统学习前端之FormData详解的更多相关文章

  1. python应用:爬虫框架Scrapy系统学习第一篇——xpath详解

    HTML的三大概念:标签.元素以及属性 标签:尖括号中的文本       例:<head>……</head> 标签通常成对出现 元素:标签中的所有内容        元素中可包 ...

  2. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  3. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  4. Linux学习之用户配置文件详解(十四)

    Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...

  5. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的  了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本    jdk版本:Jdk1.7及以上 IDE:eclipse ...

  6. [转帖]Docker学习之Dockerfile命令详解

    Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...

  7. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  8. Linux(centos)系统各个目录的作用详解

    Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...

  9. Oracle 11g客户端在Linux系统上的配置步骤详解

    Oracle 11g客户端在Linux系统上的配置步骤详解 2011-07-26 10:47 newhappy2008 CSDN博客 字号:T | T 本文我们主要介绍了Oracle 11g客户端在L ...

随机推荐

  1. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  2. Linux远程管理Windows程序Rdesktop详解

    #rpm –q rdesktop                       //查找是否已经安装 #yum install rdesktop                //使用yum安装 rde ...

  3. Nginx 函数解析之ngx_http_get_forwarded_addr_internal

    static ngx_int_t ngx_http_get_forwarded_addr_internal(ngx_http_request_t *r, ngx_addr_t *addr, u_cha ...

  4. 有趣的HTML5 Web 存储

    HTML5 web 存储,一个比cookie更好的本地存储方式. 什么是 HTML5 Web 存储? 使用HTML5可以在本地存储用户的浏览数据. 早些时候,本地存储使用的是 cookie.但是Web ...

  5. linux(centos) 下安装phpstudy 如何命令行进入mysql

    配置了phpstudy 可是进不去MySQL 老是报-bash: mysqld: command not found 解决方法:在Linux环境下运行:ln -s /phpstudy/mysql/bi ...

  6. Eclipse Git插件切换分支的时候不要Reset

    今天做了一件蠢事,我在当前分支上改了很多代码,后来切换分支的时候,有一个文件有冲突,eclipse提示这个文件冲突,我可以选择commit/stash/reset,我一看这个文件没什么关系,不需要提交 ...

  7. [Vue CLI 3] vue inspect 的源码设计实现

    首先,请记住: 它在新版本的脚手架项目里面非常重要 它有什么用呢? inspect internal webpack config 能快速地在控制台看到对应生成的 webpack 配置对象. 首先它是 ...

  8. saltstack+python批量修改服务器密码

    saltstack安装:略过 python脚本修改密码: # -*- coding utf-8 -*- import socket import re import os import sys imp ...

  9. phpinfo空白

    <?php phpinfo(); ?> 以上代码放入一个kk.php的文件里,但浏览器显示是空白. 原因: 检查php.ini文件里 disable_functions =后面有没有限制p ...

  10. Person Re-identification 系列论文笔记(六):AlignedReID

    AlignedReID Zhang X, Luo H, Fan X, et al. AlignedReID: Surpassing Human-Level Performance in Person ...