将JavaScript的jQuery库中表单转化为JSON对象的方法


Posted in Javascript onNovember 17, 2015

大家知道Jquery中有serialize方法,可以将表单序列化为一个“&”连接的字符串,但却没有提供序列化为Json的方法。不过,我们可以写一个插件实现。
 
我在网上看到有人用替换的方法,先用serialize序列化后,将&替换成“:”、“‘”:

/**
* 重置form表单
* @param formId form的id
*/
function resetQuery(formId){
var fid = "#" + formId;
var str = $(fid).serialize();
//str= cardSelectDate=3&startdate=2012-02-01&enddate=2012-02-04
var ob= strToObj(str);
alert(ob.startdate); //2012-02-01
}
function strToObj(str){
str = str.replace(/&/g, "','" );
str = str.replace(/=/g, "':'" );
str = "({'" +str + "'})" ;
obj = eval(str);
return obj;
}

/** 
   * 重置form表单 
   * @param formId form的id  
   */  
  function resetQuery(formId){  
    var fid = "#" + formId;  
    var str = $(fid).serialize();  
    //str= cardSelectDate=3&startdate=2012-02-01&enddate=2012-02-04  
    var ob= strToObj(str);  
    alert(ob.startdate);//2012-02-01  
  }  
    
  function strToObj(str){  
    str = str.replace(/&/g,"','");  
    str = str.replace(/=/g,"':'");  
    str = "({'"+str +"'})";  
    obj = eval(str);   
    return obj;  
  }

个人感觉这样做有bug。
 我的方法是,先用serializeArray序列化为数组,再封装为Json对象。
 下面是表单:

< form id = "myForm" action = "#" >
< input name = "name" />
< input name = "age" />
< input type = "submit" />
</ form >

<form id="myForm" action="#"> 
  <input name="name"/> 
  <input name="age"/> 
  <input type="submit"/> 
</form>

Jquery插件代码如下:
 

( function ($){
$.fn.serializeJson= function (){
var serializeObj={};
$( this .serializeArray()).each( function (){
serializeObj[ this .name]= this .value;
});
return serializeObj;
};
})(jQuery);

(function($){ 
    $.fn.serializeJson=function(){ 
      var serializeObj={}; 
      $(this.serializeArray()).each(function(){ 
        serializeObj[this.name]=this.value; 
      }); 
      return serializeObj; 
    }; 
  })(jQuery);

 
 
下面测试一下:

$("#myForm").bind("submit",function(e){

e.preventDefault();
console.log($( this ).serializeJson());
});

  e.preventDefault(); 
  console.log($(this).serializeJson()); 
});

测试结果:
输入a,b提交,得到序列化结果

{age: "b",name: "a"}

 
 
上面的插件,不能适用于有多个值的输入控件,例如复选框、多选的select。下面,我将插件做进一步的修改,让其支持多选。代码如下:
 

( function ($){
$.fn.serializeJson= function (){
var serializeObj={};
var array= this .serializeArray();
var str= this .serialize();
$(array).each( function (){
if (serializeObj[ this .name]){
if ($.isArray(serializeObj[ this .name])){
serializeObj[ this .name].push( this .value);
} else {
serializeObj[ this .name]=[serializeObj[ this .name], this .value];
}
} else {
serializeObj[ this .name]= this .value;
}
});
return serializeObj;
};
})(jQuery);

(function($){ 
    $.fn.serializeJson=function(){ 
      var serializeObj={}; 
      var array=this.serializeArray(); 
      var str=this.serialize(); 
      $(array).each(function(){ 
        if(serializeObj[this.name]){ 
          if($.isArray(serializeObj[this.name])){ 
            serializeObj[this.name].push(this.value); 
          }else{ 
            serializeObj[this.name]=[serializeObj[this.name],this.value]; 
          } 
        }else{ 
          serializeObj[this.name]=this.value;  
        } 
      }); 
      return serializeObj; 
    }; 
  })(jQuery);

这里,我将多选的值封装为一个数值来进行处理。如果大家使用的时候需要将多选的值封装为“,"连接的字符串或者其他形式,请自行修改相应代码。
 
测试如下:
表单:
 

< form id = "myForm" action = "#" >
< input name = "name" />
< input name = "age" />
< select multiple = "multiple" name = "interest" size = "2" >
< option value = "interest1" > interest1 </ option >
< option value = "interest2" > interest2 </ option >
< option value = "interest3" > interest3 </ option >
< option value = "interest4" > interest4 </ option >
</ select >
< input type = "checkbox" name = "vehicle" value = "Bike" /> I have a bike
< input type = "checkbox" name = "vehicle" value = "Car" /> I have a car
< input type = "submit" />
</ form >

<form id="myForm" action="#"> 
  <input name="name"/> 
  <input name="age"/> 
  <select multiple="multiple" name="interest" size="2"> 
    <option value ="interest1">interest1</option> 
    <option value ="interest2">interest2</option> 
    <option value="interest3">interest3</option> 
    <option value="interest4">interest4</option> 
  </select> 
  <input type="checkbox" name="vehicle" value="Bike" /> I have a bike 
  <input type="checkbox" name="vehicle" value="Car" /> I have a car 
  <input type="submit"/> 
</form>

测试结果:

{age: "aa",interest: ["interest2", "interest4"],name: "dd",vehicle:["Bike","Car"]}

处理序列化时的空格问题

jquery的 serialize()方法,可以对表单项进行序列化,这本来是很方便的一个功能;但是实际使用中有时会出现如下问题:

例如

<input name="content" value="ddd 567"/>

在执行 serialize()方法后,得到的却是  ddd+567这样的字符串;即jquery的序列化方法对空格进行了转义,转换成了 + 号。

解决方法

由于serialize()方法对真正的“+”号转义的是 %2B,所以可以对serialize()后的结果进行符号替换。

例如

<input name="content" value="ddd + 567 + 987"/>

<script>

var a= $('$frm1').serialize(); //序列化,默认会调用encodeURIComponent()进行编码
alert(a); // content=ddd+++567+++987
var b = a.replace(/\\+/g," ");  // g表示对整个字符串中符合条件的都进行替换
b = decodeURIComponent(b); //对serialize后的内容进行解码
alert(b); // content=ddd + 567 + 987

</script>
Javascript 相关文章推荐
基于jQuery的仿flash的广告轮播
Nov 05 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
JavaScript的null和undefined区别示例介绍
Sep 15 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
js实现文本框支持加减运算的方法
Aug 19 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
Apr 20 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
bootstrap table单元格新增行并编辑
May 19 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
May 23 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
Nov 17 #Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 #Javascript
jquery判断密码强度的验证代码
Apr 22 #Javascript
jquery实现邮箱自动填充提示功能
Nov 17 #Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 #Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 #Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 #Javascript
You might like
一个php作的文本留言本的例子(五)
2006/10/09 PHP
php&amp;java(三)
2006/10/09 PHP
ASP和PHP都是可以删除自身的
2007/04/09 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
PHP strip_tags保留多个HTML标签的方法
2016/05/22 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
指定位置如果有图片显示图片,无图片显示广告的JS
2010/06/05 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
JavaScript 数组- Array的方法总结(推荐)
2016/07/21 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
在Python程序中实现分布式进程的教程
2015/04/28 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
对Django url的几种使用方式详解
2019/08/06 Python
简单分析python的类变量、实例变量
2019/08/23 Python
十一个高级MySql面试题
2014/10/06 面试题
战友聚会邀请函
2014/01/18 职场文书
土地租赁意向书
2014/07/30 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
2014年英语工作总结
2014/12/20 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
企业宣传稿范文
2015/07/23 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python