Skip to content

Instantly share code, notes, and snippets.

@shanewholloway
Created December 11, 2012 22:12
Show Gist options
  • Save shanewholloway/4262788 to your computer and use it in GitHub Desktop.
Save shanewholloway/4262788 to your computer and use it in GitHub Desktop.
objFromForm.js is a small set of javascript to populate and restore a form to Javascript objects — and therefore JSON.
// [© 2012 Bellite.io](http://bellite.io)
// Open Source as [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/)
// vim: sw=2 ts=2 expandtab
(function(exports) {
"use strict";
function objFromForm(form, dispatch) {
if (!form || form.nodeName!="FORM") return;
dispatch = dispatch || objFromForm.dispatch
var res={}, elem, fn
function set(elem, value) {
res[elem.name] = value===undefined ? elem.value : value }
for (var i=0; i<form.elements.length; i++) {
elem = form.elements[i];
if (elem.name) {
fn = (elem.nodeName=='INPUT' ? elem.type : elem.nodeName)
fn = (dispatch[fn] || dispatch.assign)
fn(elem, set)
}
}
return res }
objFromForm.dispatch = {
checkbox: function(elem, set) {
set(elem, !!elem.checked) },
radio: function(elem, set) {
if (elem.checked) set(elem) },
SELECT: function(elem, set) {
if (elem.type=='select-one')
return set(elem)
var ans=[]
for (var i=0; i<elem.options.length; i++)
if (elem.options[i].selected)
ans.push(elem.options[i].value)
set(elem, ans) },
assign: function(elem, set) { set(elem) }}
function formFromObj(form, obj, dispatch) {
if (!form || form.nodeName!="FORM") return;
dispatch = dispatch || formFromObj.dispatch
var elem, key, fn,
names = Object.keys(obj)
for (var i=0; i<names.length; i++) {
elem = form[names[i]]
if (elem!==undefined) {
fn = (elem.nodeName=='INPUT' ? elem.type : elem.nodeName)
fn = (dispatch[fn] || dispatch.assign)
fn(elem, obj[names[i]])
}
}
return form }
formFromObj.dispatch = {
checkbox: function(elem, value) {
elem.checked = !!value },
radio: function(elem, value) {
if (elem.value == value)
elem.checked = true },
SELECT: function(elem, valueList) {
valueList = [].concat(valueList)
if (elem.type=='select-one')
return elem.value = valueList[0]
for (var i=0,opt; i<elem.options.length; i++) {
opt = elem.options[i]
opt.selected = 0<=valueList.indexOf(opt.value)
}},
assign: function assign(elem, value) {
elem.value = value }}
exports.objFromForm = objFromForm
exports.formFromObj = formFromObj
return exports;
})(this)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment