一、应用场景

    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. BZOJ3718[PA2014]Parking——树状数组

    题目描述 你的老板命令你将停车场里的车移动成他想要的样子.停车场是一个长条矩形,宽度为w.我们以其左下角顶点为原点,坐标轴平行于矩形的边,建立直角坐标系.停车场很长,我们可以认为它一直向右边伸展到无穷 ...

  2. BZOJ4555 HEOI2016/TJOI2016求和(NTT+斯特林数)

    S(i,j)=Σ(-1)j-k(1/j!)·C(j,k)·ki=Σ(-1)j-k·ki/k!/(j-k)!.原式=ΣΣ(-1)j-k·ki·2j·j!/k!/(j-k)! (i,j=0~n).可以发现 ...

  3. BZOJ5093 图的价值(NTT+斯特林数)

    显然每个点会提供相同的贡献.于是现在只考虑1号点的贡献.若其度数为i,则在2~n号点选i个连上,剩下的边随便连,这样可以算出答案为 这个式子可以O(n)计算.发现k比较小,于是考虑如何将这个式子化为与 ...

  4. Uva821-Floyd

    计算所有页面的平均距离. 用floyd求距离,再求平均 #include <algorithm> #include <cstring> #include <ctype.h ...

  5. Code POJ - 1780(栈模拟dfs)

    题意: 就是数位哈密顿回路 解析: 是就算了...尼玛还不能直接用dfs,得手动开栈模拟dfs emm...看了老大半天才看的一知半解 #include <iostream> #inclu ...

  6. float 、double 加减乘除出现小数位多出的问题

    /** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...

  7. Twitter数据挖掘:如何使用Python分析大数据 (3)

    让我们来拉取Twitter账号@NyTimes的最近20条微博. 我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline ...

  8. 自学Aruba7.1-Aruba安全认证-WPA2-PSK认证(web页面配置)

    点击返回:自学Aruba之路 自学Aruba7.1-Aruba安全认证-WPA2-PSK认证(web页面配置) 步骤1 建立AP Group,命名为test-group 步骤2  将AP加入到AP G ...

  9. luogu1073 最优贸易 (tarjan+dp)

    tarjan缩点,然后按照拓扑序,做1号点能到达的点的答案具体做法是对每个点记一个min[i],max[i],vis[i]和ans[i]做拓扑序的时候,假设在从u点开始做,有边u到v,如果vis[u] ...

  10. luogu1966 火柴排队(离散化+树状数组)

    由于是一个二次函数的关系,所以易证应该尽量让两组的顺序相同 然后就离散化乱搞几发,最后就变成了求逆序对的数量了 #include<bits/stdc++.h> #define pa pai ...