form-to-obj
Advanced tools
Comparing version 0.0.1 to 0.0.2
function formToObj(form) { | ||
var fields = formToArr(form); | ||
fields.sort(function (a, b) { | ||
return a.name.localeCompare(b.name); | ||
}); | ||
return fields.reduce(function(obj, field) { | ||
@@ -12,28 +12,34 @@ addProp(obj, field.name, field.value); | ||
}, {}); | ||
function formToArr(form) { | ||
var inputs = form.querySelectorAll('input, textarea, select'); | ||
var inputs = form.querySelectorAll('input, textarea, select, [contenteditable=true]'); | ||
var arr = []; | ||
for (var i = 0; i < inputs.length; ++i) { | ||
var input = inputs[i]; | ||
if ((input.type === 'checkbox' || input.type === 'radio') | ||
&& !input.checked) { | ||
var input = inputs[i], | ||
name = input.name || input.getAttribute('data-name'), | ||
val = input.value; | ||
if (!name || | ||
((input.type === 'checkbox' || input.type === 'radio') && !input.checked)) { | ||
continue; | ||
} | ||
if (input.getAttribute('contenteditable') === 'true') { | ||
val = input.innerHTML; | ||
} | ||
arr.push({ | ||
name: input.name, | ||
value: input.value | ||
name: name, | ||
value: val | ||
}); | ||
} | ||
return arr; | ||
} | ||
function addProp(o, prop, val) { | ||
var props = prop.split('.'); | ||
var lastProp = props.length - 1; | ||
props.reduce(function (obj, prop, i) { | ||
@@ -47,3 +53,3 @@ if (i === lastProp) { | ||
} | ||
function setProp(obj, name, val) { | ||
@@ -59,3 +65,3 @@ if (name.slice(-2) === '[]') { | ||
return arr[arr.length - 1]; | ||
} | ||
} | ||
@@ -70,3 +76,3 @@ arr.push(val); | ||
} | ||
function makeArr(obj, name) { | ||
@@ -73,0 +79,0 @@ var arrName = name.replace(/\[\d*\]/, ''); |
@@ -1,2 +0,2 @@ | ||
function formToObj(e){function r(e){for(var r=e.querySelectorAll("input, textarea, select"),n=[],t=0;t<r.length;++t){var u=r[t];("checkbox"!==u.type&&"radio"!==u.type||u.checked)&&n.push({name:u.name,value:u.value})}return n}function n(e,r,n){var u=r.split("."),o=u.length-1;u.reduce(function(e,r,u){return u===o?t(e,r,n):t(e,r,{})},e)}function t(e,r,n){if("[]"===r.slice(-2))u(e,r).push(n);else{if(e[r])return e[r];if("]"===r[r.length-1]){var t=u(e,r);if(t.prevName===r)return t[t.length-1];t.push(n),t.prevName=r}else e[r]=n}return n}function u(e,r){var n=r.replace(/\[\d*\]/,"");return e[n]||(e[n]=[])}var o=r(e);return o.sort(function(e,r){return e.name.localeCompare(r.name)}),o.reduce(function(e,r){return n(e,r.name,r.value),e},{})}"undefined"!=typeof module&&module.exports&&(module.exports=formToObj); | ||
function formToObj(e){function t(e){for(var t=e.querySelectorAll("input, textarea, select, [contenteditable=true]"),r=[],n=0;n<t.length;++n){var u=t[n],a=u.name||u.getAttribute("data-name"),o=u.value;a&&("checkbox"!==u.type&&"radio"!==u.type||u.checked)&&("true"===u.getAttribute("contenteditable")&&(o=u.innerHTML),r.push({name:a,value:o}))}return r}function r(e,t,r){var u=t.split("."),a=u.length-1;u.reduce(function(e,t,u){return u===a?n(e,t,r):n(e,t,{})},e)}function n(e,t,r){if("[]"===t.slice(-2))u(e,t).push(r);else{if(e[t])return e[t];if("]"===t[t.length-1]){var n=u(e,t);if(n.prevName===t)return n[n.length-1];n.push(r),n.prevName=t}else e[t]=r}return r}function u(e,t){var r=t.replace(/\[\d*\]/,"");return e[r]||(e[r]=[])}var a=t(e);return a.sort(function(e,t){return e.name.localeCompare(t.name)}),a.reduce(function(e,t){return r(e,t.name,t.value),e},{})}"undefined"!=typeof module&&module.exports&&(module.exports=formToObj); | ||
//# sourceMappingURL=form-to-obj.min.js.map |
{ | ||
"name": "form-to-obj", | ||
"version": "0.0.1", | ||
"version": "0.0.2", | ||
"description": "Zero dependency helper to serialize a form into a JavaScript object", | ||
@@ -5,0 +5,0 @@ "main": "form-to-obj.js", |
@@ -8,2 +8,3 @@ # form-to-obj | ||
- Handles arrays and nested objects | ||
- Handles contenteditable | ||
@@ -78,3 +79,20 @@ [](https://travis-ci.org/chrisdavies/form-to-obj) | ||
## Contenteditable support | ||
If using a contenteditable item, give it a `data-name` attribute in order to take its `innerHTML` value. | ||
This markup: | ||
```html | ||
<div contenteditable="true" data-name="whatevz"><span>Hi</span></div> | ||
``` | ||
Would produce an object like this: | ||
```javascript | ||
{ | ||
whatevz: '<span>Hi</span>' | ||
} | ||
``` | ||
### Browserify | ||
@@ -81,0 +99,0 @@ |
Sorry, the diff of this file is not supported yet
9181
69
150