-
Notifications
You must be signed in to change notification settings - Fork 2
/
populatedom.js
66 lines (54 loc) · 1.68 KB
/
populatedom.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
'use strict';
/*! populateDOM.js v.1.0 by @ftonato forked from @dannyvankooten | MIT license */
/**
* Populate form fields from a JSON object.
*
* @param form object The form element containing your input fields.
* @param data array JSON data to populate the fields with.
* @param basename string Optional basename which is added to `name` attributes
**/
export default function populateDOM( form, data, basename) {
for(let key in data) {
if( ! data.hasOwnProperty( key ) ) {
continue;
}
let name = key;
let value = data[key];
// handle array name attributes
if(typeof(basename) !== "undefined") {
name = basename + "[" + key + "]";
}
if(Array.isArray(value)) {
name += '[]';
} else if(typeof value == "object") {
populateDOM( form, value, name);
continue;
}
// only proceed if element is set
let element = form.elements.namedItem( name );
if( ! element ) {
continue;
}
// check element type
switch(element.type || element.constructor ) {
default:
element.value = value;
break;
case RadioNodeList:
for( let j=0; j < element.length; j++ ) {
element[j].checked = ( value.indexOf(element[j].value) > -1 );
}
break;
case 'select-multiple':
let values = value.constructor == Array ? value : [value];
for(let k = 0; k < element.options.length; k++) {
element.options[k].selected |= (values.indexOf(element.options[k].value) > -1 );
}
break;
case 'select':
case 'select-one':
element.value = value.toString() || value;
break;
} // end switch
} // end for
} // end module