详谈表单格式化插件jquery.serializeJSON
前言
前端在处理含有大量数据提交的表单时,除了使用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就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。