表单序列化

随着 Ajax 的出现,表单序列化成为一种常见需求

以将表单信息序列化为查询字符串为例

我们可以利用表单的 type 属性,以及 name 和 value 实现对表单的序列化

序列化应满足以下几点要求:

  • 对表单字段和值进行 url 编码,使用 & 符号分割
  • 不发送表单的禁用字段
  • 只发送勾选的复选框和单选按钮
  • 不发送 type 为 "reset" 和 "button" 的按钮
  • 多项选择为每一个选中的项单独一个条目
  • 在点击提交按钮提交的情况下,也会发送提交按钮(包括 image 的 input)
  • <select> 的value值为 <option> 的value值,若<option>没有设置 value 那么值为 <option> 的文本值

序列化函数如下:

function serialize(form){
let parts = [],
field = null; for(let i = 0, let len = form.elements.length; i < len; i++){
field = form.elements[i]; switch(field.type){
case "select-one":
case "select-multiple":// 处理 select
if(field.name.length){
for(let j = 0,let optLen = field.options.length,let option,let optValue; j < optLen; j++){
option = field.options[j];
if(option.selected){
optValue = "";
if(option.hasAttribute){// DOM
optValue = (option.hasAttribute("value")?option.value:option.text);
}else{// IE
optValue = (option.attributes["value"].specified?option.value:option.text);
}
parts.push(encodeURIComponent(field.name)+"="+encodeURIComponent(optValue));
}
}
}
break;
case undefined:// 字段集
case "file":// 文件输入
case "submit":// 提交按钮
case "reset":// 重置按钮
case "button'":
break; case "radio": // 单选按钮
case "checkbox": // 复选框
if(!field.checked){
break;
}
default:// 不包含没有 name 属性的表单字段
if(field.name.length){
parts.push(encodeURIComponent(field.name)+"="+encodeURIComponent(field.value));
}
}
}
return parts.join("&");
}

通过上述函数就可以将一个表单序列化成一个查询字符串

如果需要序列化成其他特殊格式,过程与之大同小异

需要注意的地方在于:

如果表单中包含<fieldset>元素,那么该元素会出现在元素集合中,但是该元素没有 type 属性,所以上方的函数对 type 未定义的字段没有序列化

Javascript高级编程学习笔记(80)—— 表单(8)表单序列化的更多相关文章

  1. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  2. Javascript高级编程学习笔记(74)—— 表单(2)表单提交及重置

    表单提交 表单的很大一部分作用就是帮助用户完成和服务器的交互 所以表单提交是表单中比较重要的部分 虽然现如今的大部分应用场景都使用 AJAX 的异步请求来代替表单,但是仍有部分操作需要使用表单来完成, ...

  3. JavaScript高级程序设计学习笔记第十四章--表单

    1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...

  4. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API

    自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...

  5. Javascript高级编程学习笔记(77)—— 表单(5)过滤输入

    在日常实践中,我们常常会需要用户按照某种规则输入数据 但是文本框在默认情况下缺少验证数据的手段,因此需要使用JS来完成此类过滤输入的操作 通过事件和DOM的结合手段就能够将普通的文本框转换为功能型控件 ...

  6. Javascript高级编程学习笔记(73)—— 表单(1)表单基础

    表单 JS最初的一个用途就是帮助服务器分担处理表单的责任 时至今日,虽然web应用以及JS都有了长足的发展,但是表单依然是现在web应用中比较重要的部分. 因为默认的表单控件很丑,所以有时候我们会使用 ...

  7. Javascript高级编程学习笔记(79)—— 表单(7)选择框脚本

    选择框脚本 选择框由<option>和<select>元素创建,为了方便选择框的交互,除了提供表单字段的公有方法之外 HTMLSelectElement 类型还提供下列特有的属 ...

  8. Javascript高级编程学习笔记(76)—— 表单(4)选择文本

    文本框脚本 在HTML中文本框有两种实现方式: <input> <textarea> 这两种实现方式虽然在多数情况下表现一致,但是两者之间仍存在许多重要区别 对于<inp ...

  9. Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表

    操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...

随机推荐

  1. ieee文献免费下载办法

    sci-hub是个神奇的存在,但突然有短时间不能用了,搜索很久,找到了:https://www.zhihu.com/question/68333471/answer/276287163 这个网址会实时 ...

  2. Decoders Matter for Semantic Segmentation:Data-Dependent Decoding Enables Flexible Feature Aggregation

    Decoders Matter for Semantic Segmentation:Data-Dependent Decoding Enables Flexible Feature Aggregati ...

  3. windows平台MySQL密码设置与破解

    一:制作系统服务: 1.在cmd下输入 mysql 这个相当于启动服务端了,然后该启动客户端了 .就表示安装成功. 2.再重新开启一个 cmd 窗口.kill 进程. 输入 mysql 即可进入 my ...

  4. 纯css实现无限嵌套菜单

    效果图: demo:关键的地方都以颜色明显标识 <!DOCTYPE html> <html> <head> <title>menu</title& ...

  5. UVA 2290 Transmitters

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  6. Itreatot接口实现类中modCount的作用

    modCount只有在本数据结构对应迭代器中才使用,以HashMap为例: private abstract class HashIterator implements Iterator { Entr ...

  7. chrome gps位置模拟设置

    chrome gps位置模拟设置 调试公众号页面定位,Edge 虽好实现方便,介于界面实在不符合我的调试习惯  遂上度娘寻觅chrome模拟GPS方法 找了好几个帖子,发现新版本已经不再试用.不得感叹 ...

  8. 每日一练ACM 2019.0422

    Problem Description 根据输入的半径值,计算球的体积.   Input 输入数据有多组,每组占一行,每行包括一个实数,表示球的半径.   Output 输出对应的球的体积,对于每组输 ...

  9. JPA-04

    一.JPQL JPA的查询语言(和SQL非常像,面向对象的查询语言) 有list集合可以用size看长度 分页:setFirstResult().setMaxResults(); 获取总条数:getS ...

  10. windowsSevice程序和topshelf程序创建服务对比

    文章原地址:http://www.80iter.com/blog/1451523192435464 Topshelf 创建.net服务整理和安装步骤 windowsService和topshelf服务 ...