From 55c3f77c148383cc9b8bb69928fc0fcba0642019 Mon Sep 17 00:00:00 2001 From: Bill Belanger Date: Sun, 18 Dec 2016 08:41:57 -0500 Subject: [PATCH 1/4] Added tests for number encoding --- test/integration/encode-test.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/test/integration/encode-test.js b/test/integration/encode-test.js index 507adbc..a9dc776 100644 --- a/test/integration/encode-test.js +++ b/test/integration/encode-test.js @@ -27,4 +27,34 @@ describe("encode", function() { assert.deepEqual($form.serializeObject(), {a: "on"}); }); + it("checkbox inputs as booleans if encode option turned on", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject({'encodes': { 'checkbox': true } }), {a: true}); + }); + + it("checkbox inputs as strings if encode option turned off", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject({'encodes': { 'checkbox': false } }), {a: "on"}); + }); + + it("checkbox inputs as booleans if encode option not provided", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject(), {a: true}); + }); + + it("number inputs as numbers if encode option turned on", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject({'encodes': { 'number': true } }), {a: 6}); + }); + + it("number inputs as strings if encode option turned off", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject({'encodes': { 'number': false } }), {a: "6"}); + }); + + it("number inputs as strings if encode option not provided", function() { + var $form = $('
'); + assert.deepEqual($form.serializeObject(), {a: "6"}); + }); + }); From 322ddd97e8b4ac7ec3f66427011c0f512c172d70 Mon Sep 17 00:00:00 2001 From: Bill Belanger Date: Sun, 18 Dec 2016 09:04:41 -0500 Subject: [PATCH 2/4] Added options support & number encoding --- jquery.serialize-object.js | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/jquery.serialize-object.js b/jquery.serialize-object.js index 6b33f37..d2e20eb 100644 --- a/jquery.serialize-object.js +++ b/jquery.serialize-object.js @@ -35,11 +35,14 @@ named: /^[a-z0-9_]+$/i }; - function FormSerializer(helper, $form) { + function FormSerializer(helper, $form, optionDef) { // private variables var data = {}, - pushes = {}; + pushes = {}, + options = {}; + + options = initializeOptions(optionDef); // private API function build(base, key, value) { @@ -83,7 +86,16 @@ function encode(pair) { switch ($('[name="' + pair.name + '"]', $form).attr("type")) { case "checkbox": + if(!options.encodes.checkbox) { + return pair.value; + } return pair.value === "on" ? true : pair.value; + case "number": + case "num": + if(!options.encodes.number) { + return pair.value; + } + return parseInt(pair.value); default: return pair.value; } @@ -113,6 +125,14 @@ function serializeJSON() { return JSON.stringify(serialize()); } + + function initializeOptions(optionDef) { + var options = optionDef === undefined ? {} : optionDef; + options.encodes = options.encodes === undefined ? {} : options.encodes; + options.encodes.checkbox = options.encodes.checkbox === undefined ? true : options.encodes.checkbox; + options.encodes.number = options.encodes.number === undefined ? false : options.encodes.number; + return options; + } // public API this.addPair = addPair; @@ -123,14 +143,14 @@ FormSerializer.patterns = patterns; - FormSerializer.serializeObject = function serializeObject() { - return new FormSerializer($, this). + FormSerializer.serializeObject = function serializeObject(optionDef) { + return new FormSerializer($, this, optionDef). addPairs(this.serializeArray()). serialize(); }; - FormSerializer.serializeJSON = function serializeJSON() { - return new FormSerializer($, this). + FormSerializer.serializeJSON = function serializeJSON(optionDef) { + return new FormSerializer($, this, optionDef). addPairs(this.serializeArray()). serializeJSON(); }; From bfffa51dfa7c79bbf0560deeb2850bb2d0889f45 Mon Sep 17 00:00:00 2001 From: Bill Belanger Date: Sun, 18 Dec 2016 09:07:08 -0500 Subject: [PATCH 3/4] build --- dist/jquery.serialize-object.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/jquery.serialize-object.min.js b/dist/jquery.serialize-object.min.js index 6153c3b..bf4a98f 100644 --- a/dist/jquery.serialize-object.min.js +++ b/dist/jquery.serialize-object.min.js @@ -5,4 +5,4 @@ * @license BSD * @version 2.5.0 */ -!function(e,i){if("function"==typeof define&&define.amd)define(["exports","jquery"],function(e,r){return i(e,r)});else if("undefined"!=typeof exports){var r=require("jquery");i(exports,r)}else i(e,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,i){function r(e,r){function n(e,i,r){return e[i]=r,e}function a(e,i){for(var r,a=e.match(t.key);void 0!==(r=a.pop());)if(t.push.test(r)){var u=s(e.replace(/\[\]$/,""));i=n([],u,i)}else t.fixed.test(r)?i=n([],r,i):t.named.test(r)&&(i=n({},r,i));return i}function s(e){return void 0===h[e]&&(h[e]=0),h[e]++}function u(e){switch(i('[name="'+e.name+'"]',r).attr("type")){case"checkbox":return"on"===e.value?!0:e.value;default:return e.value}}function f(i){if(!t.validate.test(i.name))return this;var r=a(i.name,u(i));return l=e.extend(!0,l,r),this}function d(i){if(!e.isArray(i))throw new Error("formSerializer.addPairs expects an Array");for(var r=0,t=i.length;t>r;r++)this.addPair(i[r]);return this}function o(){return l}function c(){return JSON.stringify(o())}var l={},h={};this.addPair=f,this.addPairs=d,this.serialize=o,this.serializeJSON=c}var t={validate:/^[a-z_][a-z0-9_]*(?:\[(?:\d*|[a-z0-9_]+)\])*$/i,key:/[a-z0-9_]+|(?=\[\])/gi,push:/^$/,fixed:/^\d+$/,named:/^[a-z0-9_]+$/i};return r.patterns=t,r.serializeObject=function(){return new r(i,this).addPairs(this.serializeArray()).serialize()},r.serializeJSON=function(){return new r(i,this).addPairs(this.serializeArray()).serializeJSON()},"undefined"!=typeof i.fn&&(i.fn.serializeObject=r.serializeObject,i.fn.serializeJSON=r.serializeJSON),e.FormSerializer=r,r}); +!function(e,r){if("function"==typeof define&&define.amd)define(["exports","jquery"],function(e,n){return r(e,n)});else if("undefined"!=typeof exports){var n=require("jquery");r(exports,n)}else r(e,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,r){function n(e,n,t){function a(e,r,n){return e[r]=n,e}function s(e,r){for(var n,t=e.match(i.key);void 0!==(n=t.pop());)if(i.push.test(n)){var s=o(e.replace(/\[\]$/,""));r=a([],s,r)}else i.fixed.test(n)?r=a([],n,r):i.named.test(n)&&(r=a({},n,r));return r}function o(e){return void 0===z[e]&&(z[e]=0),z[e]++}function u(e){switch(r('[name="'+e.name+'"]',n).attr("type")){case"checkbox":return m.encodes.checkbox?"on"===e.value||e.value:e.value;case"number":case"num":return m.encodes.number?parseInt(e.value):e.value;default:return e.value}}function d(r){if(!i.validate.test(r.name))return this;var n=s(r.name,u(r));return v=e.extend(!0,v,n),this}function c(r){if(!e.isArray(r))throw new Error("formSerializer.addPairs expects an Array");for(var n=0,i=r.length;n Date: Sun, 18 Dec 2016 09:33:14 -0500 Subject: [PATCH 4/4] Accounted for not-number values (like empty string) --- dist/jquery.serialize-object.min.js | 2 +- jquery.serialize-object.js | 3 ++- test/integration/encode-test.js | 5 +++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/dist/jquery.serialize-object.min.js b/dist/jquery.serialize-object.min.js index bf4a98f..bf224ba 100644 --- a/dist/jquery.serialize-object.min.js +++ b/dist/jquery.serialize-object.min.js @@ -5,4 +5,4 @@ * @license BSD * @version 2.5.0 */ -!function(e,r){if("function"==typeof define&&define.amd)define(["exports","jquery"],function(e,n){return r(e,n)});else if("undefined"!=typeof exports){var n=require("jquery");r(exports,n)}else r(e,e.jQuery||e.Zepto||e.ender||e.$)}(this,function(e,r){function n(e,n,t){function a(e,r,n){return e[r]=n,e}function s(e,r){for(var n,t=e.match(i.key);void 0!==(n=t.pop());)if(i.push.test(n)){var s=o(e.replace(/\[\]$/,""));r=a([],s,r)}else i.fixed.test(n)?r=a([],n,r):i.named.test(n)&&(r=a({},n,r));return r}function o(e){return void 0===z[e]&&(z[e]=0),z[e]++}function u(e){switch(r('[name="'+e.name+'"]',n).attr("type")){case"checkbox":return m.encodes.checkbox?"on"===e.value||e.value:e.value;case"number":case"num":return m.encodes.number?parseInt(e.value):e.value;default:return e.value}}function d(r){if(!i.validate.test(r.name))return this;var n=s(r.name,u(r));return v=e.extend(!0,v,n),this}function c(r){if(!e.isArray(r))throw new Error("formSerializer.addPairs expects an Array");for(var n=0,i=r.length;n'); + assert.deepEqual($form.serializeObject({'encodes': { 'number': true } }), {a: ""}); + }); + });