一、应用场景

    form提交时,使用ajax提交。

二、效果

    通过本工具,实现表单所有form的快速序列化和json化,使前端人员在ajax提交form表单的时,脱离重复性的,大劳动量的手动抽取form属性和对应的值。

    注:本工具的功能,也可以通过原生的FormData([HTMLFormElement]) + JSON.stringify() + JSON.parse()实现。

三、源码[form.js]

    

//将数据序列化成 url请求方式的编码
function serialize(form){
var len=form.elements.length;//表单字段长度;表单字段包括<input><select><button>等
var field=null;//用来存储每一条表单字段
var parts=[];//保存字符串将要创建的各个部分
var opLen,//select中option的个数
normalValue,//text,number,date,textarea的值
opValue;//select中option的值
//遍历每一个表单字段
for(var i=0;i<len;i++){
field=form.elements[i];
/*检测每一个表单字段的类型,做出不同的处理:
*1.最麻烦的就是select:它可能是单选框也可能是多选框,这里的代码适合于这两种框。在找到一个选中的项之后,需要确
*定使用什么值。如果不存在value特性或者虽然存在但是值为空字符串,都要使用选项的文本来代替。为查这个属性,在DOM兼
*容的浏览器中使用hasAttribute()方法,在IE中需要使用特性的specified属性。
*2.表单中如果包括<fieldset>
*元素,则该元素会出现在表单集合中但是没有type属性。因此,如果type属性未定义,则不必对其进行序列化;同样,对于
*各种按钮以及文件输入字段都是如此。
*3.对于单选按钮和复选框,要检查其checked属性是否被设置为false,如果是则退出switch语句,如果checked属性为true
*则继续进行default内容,即将当前的名称和值进行编码,然后添加到parts数组中。函数的最后一步就是使用join格式化整
*个字符串,也就是用和好来分隔每一个表单字段
*/
switch(field.type){
case"select-one":
case"select-multiple":
if(field.name.length){
for(var j=0,opLen=filed.options.length;j<opLen;j++){
option=field.options[j];
if(option.selected){
opValue='';
if(option.hasAttribute){
opValue=(option.hasAttribute('value')?option.value:option.text);
}else{
opValue=(option.hasAttribute['value'].specified?option.value:option.text);//IE下
}
parts.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(opValue));
} }
}
break;
case undefined:
case "file":
case "submit":
case "reset":
case "button":
break;
case "text":
case "number":
case "date":
case "textarea":
if(field.name.length){
normalValue = field.value;
parts.push(encodeURIComponent(field.name)+'='+encodeURIComponent(normalValue));
}
break;
case "radio":
case "checkbox":
if(!field.checked){
break;
}
default:
if(field.name.length){
parts.push(encodeURIComponent(field.name)+'='+encodeURIComponent(opValue));
}
break;
}
}
return parts.join("&");
}

//将form数据字符串化成符合json格式的字符串
function stringify(form){
var len=form.elements.length;//表单字段长度;表单字段包括<input><select><button>等
var field=null;//用来存储每一条表单字段
var parts=[];//保存字符串将要创建的各个部分
var opLen,//select中option的个数
normalValue,//text,number,date,textarea的值
opValue;//select中option的值
//遍历每一个表单字段
for(var i=0;i<len;i++){
field=form.elements[i];
/*检测每一个表单字段的类型,做出不同的处理:
*1.最麻烦的就是select:它可能是单选框也可能是多选框,这里的代码适合于这两种框。在找到一个选中的项之后,需要确
*定使用什么值。如果不存在value特性或者虽然存在但是值为空字符串,都要使用选项的文本来代替。为查这个属性,在DOM兼
*容的浏览器中使用hasAttribute()方法,在IE中需要使用特性的specified属性。
*2.表单中如果包括<fieldset>
*元素,则该元素会出现在表单集合中但是没有type属性。因此,如果type属性未定义,则不必对其进行序列化;同样,对于
*各种按钮以及文件输入字段都是如此。
*3.对于单选按钮和复选框,要检查其checked属性是否被设置为false,如果是则退出switch语句,如果checked属性为true
*则继续进行default内容,即将当前的名称和值进行编码,然后添加到parts数组中。函数的最后一步就是使用join格式化整
*个字符串,也就是用和好来分隔每一个表单字段
*/
switch(field.type){
case"select-one":
case"select-multiple":
if(field.name.length){
for(var j=0,opLen=filed.options.length;j<opLen;j++){
option=field.options[j];
if(option.selected){
opValue='';
if(option.hasAttribute){
opValue=(option.hasAttribute('value')?option.value:option.text);
}else{
opValue=(option.hasAttribute['value'].specified?option.value:option.text);//IE下
}
parts.push(encodeURIComponent('"'+ field.name + '":"') + encodeURIComponent(opValue)) + '"';
} }
}
break;
case undefined:
case "file":
case "submit":
case "reset":
case "button":
break;
case "text":
case "number":
case "date":
case "textarea":
if(field.name.length){
normalValue = field.value;
parts.push('"' + field.name + '":"' + normalValue.trim() + '"');
}
break;
case "radio":
case "checkbox":
if(!field.checked){
break;
}
default:
if(field.name.length){
parts.push('"' + field.name + '":"' + normalValue+ '"');
}
break;
}
}
return '{' + parts.join(',') + '}';
}

四、注意

  json字符串实例化为json对象时,对json字符串的格式有严格规定,属性名和属性值必须用双引号引起,否则在调用JSON转化时,将报错,且实例化失败。

五、无关

  格式化Js原生日期为字符串 形如:2008/12/12 12:12:30

    function formatDateToStr(date){
var str = "";
str += date.toLocaleDateString() + " "; str += date.getHours() + ":";
str += date.getMinutes() + ":";
str += date.getSeconds();
return str;
}
function formatDateToStr(date){
var str = "";
str += date.toLocaleDateString() + " ";
str += date.getHours() + ":";
str += date.getMinutes() + ":";
str += date.getSeconds();
return str;
}

JavaScript之form表单的序列化和json化[form.js]的更多相关文章

  1. jquery获取form表单内容以及绑定数据到form表单

    在日常开发的过程中,难免会用到form表单,我们需要获取表单的数据保存到数据库,或者拿到后台的一串json数据,要将数据绑定到form表单上,这里我写了一个基于jquery的,formHelp插件,使 ...

  2. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  3. 【jQuery】form表单元素序列化为json对象

    序列化form表单元素为json对象: <!Doctype html> <html xmlns=http://www.w3.org/1999/xhtml> <head&g ...

  4. Ajax提交form表单内容和文件(jQuery.form.js)

    jQuery官网是这样介绍form.js A simple way to AJAX-ify any form on your page; with file upload and progress s ...

  5. form表单嵌套,用标签的form属性来解决表单嵌套的问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 纯js将form表单的数据封装成json 以便于ajax发送

    使用方式: var json = form2Json("formId");//这里的参数是form表单的id值 form2json.js function form2Json(fo ...

  7. javaWeb 中前端Form表单数据处理(手动拼json)

    在前端我们会用到最多的就是form表单提交数据,在form表单中有很多都是自动将数据传到后台,然后通过实体来接受的,但是有的时候我们就是需要在前端就拿到这个Form表单的数据,这是我们就可以自己讲数据 ...

  8. jQuery将form表单的数据封装成json对象

    /** * 自动将form表单封装成json对象 */ $.fn.serializeObject = function() { var o = {}; var a = this.serializeAr ...

  9. form表单在前台转json对象

    会发生序列化乱码问题,待解决. //根据表单id将其内空间,名称,值转为json var fireTraceEquipment =queryParamByFormId('form1'); functi ...

随机推荐

  1. Highcharts之饼图

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. codeforces3A

    Shortest path of the king CodeForces - 3A 棋盘上的国王被单独放置.尽管他是孤独的,但并未伤心,因为他有事关全局的重要性.例如,他必须正式访问方格 t .由于国 ...

  3. File操作

    对文件进行操作(只操作小文件) bool Exists(string path) 判断文件是否存在 FileStream Create(string path) 创建文件 void Move(stri ...

  4. Web Scraper爬取就是这么简单

    这应该是最全的一个文档了 https://www.jianshu.com/p/e4c1561a3ea7 所以我就不介绍了,大家直接看就可以了,有问题可以提出来,我会针对问题对文章进行补充~

  5. MT【204】离散型最值

    (联赛一试2006,14).将2006表示成5个正整数$x_1,x_2,x_3,x_4,x_5$之和.记$S=\sum\limits_{1\le i<j\le5}{x_ix_j}$问:(1) 当 ...

  6. nowcoder172A 中位数 (二分答案)

    二分一下答案,假设是x. 我们把大于x的看成1,小于x的看成-1,等于x的看成0 那某个区间的和如果是正的,就说明这个区间中位数大于x:如果是0,就等于x:如果是负的,就小于x: 这样的话,做一个前缀 ...

  7. [luogu1327][生活大爆炸石头剪子布]

    题目地址 https://www.luogu.org/problemnew/show/P1328 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. ...

  8. centos7部署posgresql和kong总结

    之前在macos系统测试安装psql和kong,但是实际环境中,大部分是部署在linux服务器上.下面记录了在centos7上部署postgresql和kong的总结以及遇到的一些问题的解决. 查看c ...

  9. SNP (Single Nucleotide Polymorphism), SNV ( single nucleotide variants ) , Indel (insertion-deletion) 的区别

    SNP (Single Nucleotide Polymorphism):强调在一个群体中具有一定频率的变异,一般为二态性.比如G→C SNV ( single nucleotide variants ...

  10. pageisELIgnored作用

    在page指令中有一个isELIgnored属性,其值为true则忽略EL表达式,为false则解析表达式