一、应用场景

    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. delphi 右键删除dbgrid行

    Delphi DBGrid右键删除行并提交至数据库.在form上添加,控件TPopupMenu,并指定右键名称:删行 2.编写删除语句: If ADOQuery1.State in [dsEdit, ...

  2. 关于js特效轮播图练习

    [出现问题] js轮播图,图片未正常轮播. [解决方法] 通过对代码的检查,发现是以下三个原因造成的错误. 1.js代码问题 js代码使用alert(test);,测试修改完毕后,发现依然没有解决错误 ...

  3. hdu 3949 XOR (线性基)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...

  4. MT【216】韦达定理

    设$n$为正整数,$a_1,a_2,\cdots,a_n;b_1,b_2,\cdots,b_n;A,B$都是正数, 满足$a_i\le b_i,a_i\le A,i=1,2,\cdots,n$ 且$\ ...

  5. MT【37】二次函数与整系数有关的题

    解析: 评:两根式是不错的考虑方向,一方面二次函数两根式之前有相应的经验,另一方面这里$\sqrt{\frac{b^2}{4}-c}$正好和两个根有关系.

  6. emwin之多次删除同一窗口导致死机现象

    @218-7-24 [现象] 使用函数 GUI_EndDialog() 多次删除同一窗口,导致系统死机,调试发现代码会卡死在以下两处 > 1.启动文件中 > 2.HardFault中断内 ...

  7. JS循环中使用bind函数的参数传递问题

    JS循环中使用bind函数的参数传递问题,问题代码如下: for (var sc in result) { var tempp = '<div class="sidebar_todo_ ...

  8. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  9. 【LOJ#6283】数列分块7

    题目大意:维护一个 N 个数组成的序列,支持区间加.区间乘.单点询问. 题解:在每一个块中维护两个标记,即:整块加和的标记和整块乘积的标记.不过由于有两个标记,涉及到计算区间总和的顺序问题. 一个指定 ...

  10. grafana配置

    grafana配置 官网介绍:http://docs.grafana.org/installation/configuration/ 以deb或者rpm安装的,则默认的配置文件是/etc/grafan ...