将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 相关文章推荐
JS中setTimeout()的用法详解
Apr 14 Javascript
jQuery实现带动画效果的多级下拉菜单代码
Sep 08 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 Javascript
AngularJS 异步解决实现方法
Jun 12 Javascript
原生js封装运动框架的示例讲解
Oct 01 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
Sep 29 Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 Javascript
详解mpvue实现对苹果X安全区域的适配
Jul 31 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
js 执行上下文和作用域的相关总结
Feb 08 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
基于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防注
2007/01/15 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
js+css在交互上的应用
2010/07/18 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
js简易版购物车功能
2017/06/17 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
python处理html转义字符的方法详解
2016/07/01 Python
HTML的form表单和django的form表单
2019/07/25 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
网吧最新创业计划书范文
2014/03/27 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
党员批评与自我批评
2014/10/15 职场文书
丽江古城导游词
2015/02/03 职场文书
公司欠款证明
2015/06/24 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL