欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详谈表单格式化插件jquery.serializeJSON

程序员文章站 2022-04-10 10:16:26
前言 前端在处理含有大量数据提交的表单时,除了使用form直接提交刷新页面之外,经常碰到的需求是收集表单信息成数据对象,ajax提交。 而在处理复杂的表单时,需要一个一...

前言

前端在处理含有大量数据提交的表单时,除了使用form直接提交刷新页面之外,经常碰到的需求是收集表单信息成数据对象,ajax提交。

而在处理复杂的表单时,需要一个一个区手动判断处理字段值,显得非常麻烦。接下来介绍的插件将解决这个问题。

关于serializejson

使用jquery.serializejson,可以在基于jquery或者zepto的页面中,调用 .serializejson() 方法来序列化form表单的数据成js对象。

使用

只需要在jquery或者zepto时候引入即可

 <script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.serializejson.js"></script>

示例

html form(支持input、textarea、select等标签)

<form id="my-profile">
  <!-- simple attribute -->
  <input type="text" name="fullname"       value="mario izquierdo" />
 
  <!-- nested attributes -->
  <input type="text" name="address[city]"     value="san francisco" />
  <input type="text" name="address[state][name]" value="california" />
  <input type="text" name="address[state][abbr]" value="ca" />
 
  <!-- array -->
  <input type="text" name="jobbies[]"       value="code" />
  <input type="text" name="jobbies[]"       value="climbing" />
 
  <!-- textareas, checkboxes ... -->
  <textarea       name="projects[0][name]">serializejson</textarea>
  <textarea       name="projects[0][language]">javascript</textarea>
  <input type="hidden"  name="projects[0][popular]" value="0" />
  <input type="checkbox" name="projects[0][popular]" value="1" checked />
 
  <textarea       name="projects[1][name]">tinytest.js</textarea>
  <textarea       name="projects[1][language]">javascript</textarea>
  <input type="hidden"  name="projects[1][popular]" value="0" />
  <input type="checkbox" name="projects[1][popular]" value="1"/>
 
  <!-- select -->
  <select name="selectone">
    <option value="paper">paper</option>
    <option value="rock" selected>rock</option>
    <option value="scissors">scissors</option>
  </select>
 
  <!-- select multiple options, just name it as an array[] -->
  <select multiple name="selectmultiple[]">
    <option value="red" selected>red</option>
    <option value="blue" selected>blue</option>
    <option value="yellow">yellow</option>
  </select>
</form>

javascript:

$('#my-profile').serializejson();
 
// returns =>
{
  fullname: "mario izquierdo",
 
  address: {
  city: "san francisco",
  state: {
    name: "california",
    abbr: "ca"
    }
  },
 
  jobbies: ["code", "climbing"],
 
  projects: {
    '0': { name: "serializejson", language: "javascript", popular: "1" },
    '1': { name: "tinytest.js",  language: "javascript", popular: "0" }
  },
 
  selectone: "rock",
  selectmultiple: ["red", "blue"]
}

serializejson方法返回一个js对象,并非json字符串。可以使用 json.stringify 转换成字符串(注意ie8兼容性)。

javascript权威指南(第6版)(中文版) http://www.gooln.com/document/452.html

 var jsonstring = json.stringify(obj);

指定数据类型

获取到的属性值一般是字符串,可以通过html指定类型 : type 进行强制转换。

<form>
  <input type="text" name="notype"      value="default type is :string"/>
  <input type="text" name="string:string"  value=":string type overrides parsing options"/>
  <input type="text" name="excluded:skip"  value="use :skip to not include this field in the result"/>
 
  <input type="text" name="number[1]:number"      value="1"/>
  <input type="text" name="number[1.1]:number"     value="1.1"/>
  <input type="text" name="number[other stuff]:number" value="other stuff"/>
 
  <input type="text" name="boolean[true]:boolean"   value="true"/>
  <input type="text" name="boolean[false]:boolean"   value="false"/>
  <input type="text" name="boolean[0]:boolean"     value="0"/>
 
  <input type="text" name="null[null]:null"      value="null"/>
  <input type="text" name="null[other stuff]:null"   value="other stuff"/>
 
  <input type="text" name="auto[string]:auto"     value="text with stuff"/>
  <input type="text" name="auto[0]:auto"        value="0"/>
  <input type="text" name="auto[1]:auto"        value="1"/>
  <input type="text" name="auto[true]:auto"      value="true"/>
  <input type="text" name="auto[false]:auto"      value="false"/>
  <input type="text" name="auto[null]:auto"      value="null"/>
  <input type="text" name="auto[list]:auto"      value="[1, 2, 3]"/>
 
  <input type="text" name="array[empty]:array"     value="[]"/>
  <input type="text" name="array[list]:array"     value="[1, 2, 3]"/>
 
  <input type="text" name="object[empty]:object"    value="{}"/>
  <input type="text" name="object[dict]:object"    value='{"my": "stuff"}'/>
</form>
$('form').serializejson();
 
// returns =>
{
  "notype": "default type is :string",
  "string": ":string type overrides parsing options",
  // :skip type removes the field from the output
  "number": {
    "1": 1,
    "1.1": 1.1,
    "other stuff": nan, // <-- other stuff parses as nan (not a number)
  },
  "boolean": {
    "true": true,
    "false": false,
    "0": false, // <-- "false", "null", "undefined", "", "0" parse as false
  },
  "null": {
    "null": null, // <-- "false", "null", "undefined", "", "0" parse as null
    "other stuff": "other stuff"
  },
  "auto": { // works as the parseall option
    "string": "text with stuff",
    "0": 0,     // <-- parsed as number
    "1": 1,     // <-- parsed as number
    "true": true,  // <-- parsed as boolean
    "false": false, // <-- parsed as boolean
    "null": null,  // <-- parsed as null
    "list": "[1, 2, 3]" // <-- array and object types are not auto-parsed
  },
  "array": { // <-- works using json.parse
    "empty": [],
    "not empty": [1,2,3]
  },
  "object": { // <-- works using json.parse
    "empty": {},
    "not empty": {"my": "stuff"}
  }
}

数据类型也可以指定在 data-value-type 属性中,代替 :type 标记。

<form>
 <input type="text" name="number[1]"   data-value-type="number" value="1"/>
 <input type="text" name="number[1.1]"  data-value-type="number" value="1.1"/>
 <input type="text" name="boolean[true]" data-value-type="boolean" value="true"/>
 <input type="text" name="null[null]"  data-value-type="null"  value="null"/>
 <input type="text" name="auto[string]" data-value-type="auto"  value="0"/>
</form>

options配置

默认配置

values始终为字符串(除非在input names使用:types )

keys始终为字符串(默认不自动检测是否需要转换为数组)

未选择的checkboxes会被忽略

disabled的elements会被忽略

自定义配置

包含未勾选的checkboxes

serializejson 支持 checkboxuncheckedvalue 配置,或者可以在checkboxes添加 data-unchecked-value 属性。

默认方法:

<form>
 <input type="checkbox" name="check1" value="true" checked/>
 <input type="checkbox" name="check2" value="true"/>
 <input type="checkbox" name="check3" value="true"/>
</form>
$('form').serializejson();
 
// returns =>
{'check1': 'true'} // note that check2 and check3 are not included because they are not checked

上面的写法会忽略未勾选的复选框。如果需要包含,则可以使用以下方法:

1. 配置checkboxuncheckedvalue

$('form').serializejson({checkboxuncheckedvalue: "false"});
 
// returns =>
{'check1': 'true', check2: 'false', check3: 'false'}

2. 添加data-unchecked-value属性

<form id="checkboxes">
 <input type="checkbox" name="checked[bool]" value="true" data-unchecked-value="false" checked/>
 <input type="checkbox" name="checked[bin]"  value="1"  data-unchecked-value="0"   checked/>
 <input type="checkbox" name="checked[cool]" value="yup"                checked/>
 
 <input type="checkbox" name="unchecked[bool]" value="true" data-unchecked-value="false" />
 <input type="checkbox" name="unchecked[bin]"  value="1"  data-unchecked-value="0" />
 <input type="checkbox" name="unchecked[cool]" value="yup" /> <!-- no unchecked value specified -->
</form>
$('form#checkboxes').serializejson(); // note no option is used
 
// returns =>
{
 'checked': {
  'bool': 'true',
  'bin':  '1',
  'cool': 'yup'
 },
 'unchecked': {
  'bool': 'false',
  'bin': '0'
  // note that unchecked cool does not appear, because it doesn't use data-unchecked-value
 }
}

自动检测转换类型

默认的类型为字符串 :string ,可以通过配置转换为其它类型

$('form').serializejson({parsenulls: true, parsenumbers: true});
 
// returns =>
{
 "bool": {
  "true": "true", // booleans are still strings, because parsebooleans was not set
  "false": "false",
 }
 "number": {
  "0": 0, // numbers are parsed because parsenumbers: true
  "1": 1,
  "2.2": 2.2,
  "-2.25": -2.25,
 }
 "null": null, // "null" strings are converted to null becase parsenulls: true
 "string": "text is always string",
 "empty": ""
}

在极少数情况下,可以使用自定义转换函数

var emptystringsandzerostonulls = function(val, inputname) {
 if (val === "") return null; // parse empty strings as nulls
 if (val === 0) return null; // parse 0 as null
 return val;
}
 
$('form').serializejson({parsewithfunction: emptystringsandzerostonulls, parsenumbers: true});
 
// returns =>
{
 "bool": {
  "true": "true",
  "false": "false",
 }
 "number": {
  "0": null, // <-- parsed with custom function
  "1": 1,
  "2.2": 2.2,
  "-2.25": -2.25,
 }
 "null": "null",
 "string": "text is always string",
 "empty": null // <-- parsed with custom function
}

自定义类型

可以使用 customtypes 配置自定义类型或者覆盖默认类型($.serializejson.defaultoptions.defaulttypes)

<form>
 <input type="text" name="scary:alwaysboo" value="not boo"/>
 <input type="text" name="str:string"   value="str"/>
 <input type="text" name="number:number"  value="5"/>
</form>
$('form').serializejson({
 customtypes: {
  alwaysboo: function(str) { // value is always a string
   return "boo";
  },
  string: function(str) { // all strings will now end with " override"
   return str + " override";
  }
 }
});
 
// returns =>
{
 "scary": "boo",    // <-- parsed with type :alwaysboo
 "str": "str override", // <-- parsed with new type :string (instead of the default)
 "number": 5,      // <-- the default :number still works
}

忽略空表单字段

// select only imputs that have a non-empty value
$('form :input[value!=""]').serializejson();
 
// or filter them from the form
obj = $('form').find('input').not('[value=""]').serializejson();
 
// for more complicated filtering, you can use a function
obj = $form.find(':input').filter(function () {
     return $.trim(this.value).length > 0
   }).serializejson();

使用整数keys作为数组的顺序

使用useintkeyasarrayindex配置

<form>
 <input type="text" name="arr[0]" value="foo"/>
 <input type="text" name="arr[1]" value="var"/>
 <input type="text" name="arr[5]" value="inn"/>
</form>

按照默认的方法,结果为:


$('form').serializejson();
 
// returns =>
{'arr': {'0': 'foo', '1': 'var', '5': 'inn' }}
 

使用useintkeyasarrayindex可以将记过转换为数组并制定顺序

$('form').serializejson({useintkeysasarrayindex: true});
 
// returns =>
{'arr': ['foo', 'var', undefined, undefined, undefined, 'inn']}

默认配置defaults

所有的默认配置均定义在 $.serializejson.defaultoptions,可以进行修改。

$.serializejson.defaultoptions.parseall = true; // parse booleans, numbers and nulls by default
 
$('form').serializejson(); // no options => then use $.serializejson.defaultoptions
 
// returns =>
{
 "bool": {
  "true": true,
  "false": false,
 }
 "number": {
  "0": 0,
  "1": 1,
  "2.2": 2.2,
  "-2.25": -2.25,
 }
 "null": null,
 "string": "text is always string",
 "empty": ""
}

总结

这个插件支持的配置非常丰富,自定义程度很高,带来很大的便捷性。

以上这篇详谈表单格式化插件jquery.serializejson就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。