* Serializes the given form into an object, excluding password and file inputs. * * @param {HTMLFormElement} form The form to serialize. * @param {Object} options Options object containing any of the following: * * include - Define a whitelist array of data names to
(form, options)
| 72 | * @return {Object} The serialized data object. |
| 73 | */ |
| 74 | function serialize(form, options) { |
| 75 | let defaults = { |
| 76 | include: [], |
| 77 | exclude: [], |
| 78 | includeFilter: null, |
| 79 | excludeFilter: null |
| 80 | } |
| 81 | let config = Object.assign({}, defaults, options) |
| 82 | let data = {} |
| 83 | for (let element of form.elements) { |
| 84 | let tag = element.tagName |
| 85 | let type = element.type |
| 86 | if (tag === 'INPUT' && (type === 'password' || type === 'file')) { |
| 87 | continue // do not serialize passwords or files |
| 88 | } |
| 89 | if (isNameFiltered(element.name, config.include, config.exclude) |
| 90 | || isElementFiltered(element, config.includeFilter, config.excludeFilter)) { |
| 91 | continue |
| 92 | } |
| 93 | if (tag === 'INPUT') { |
| 94 | let type = element.type |
| 95 | if (type === 'radio') { |
| 96 | if (element.checked) { |
| 97 | pushToArray(data, element.name, element.value) |
| 98 | } |
| 99 | } else if (type === 'checkbox') { |
| 100 | pushToArray(data, element.name, element.checked) |
| 101 | } else { |
| 102 | pushToArray(data, element.name, element.value) |
| 103 | } |
| 104 | } else if (tag === 'TEXTAREA') { |
| 105 | pushToArray(data, element.name, element.value) |
| 106 | } else if (tag === 'SELECT') { |
| 107 | if (element.multiple) { |
| 108 | for (let option of element.options) { |
| 109 | if (option.selected) { |
| 110 | pushToArray(data, element.name, option.value) |
| 111 | } |
| 112 | } |
| 113 | } else { |
| 114 | pushToArray(data, element.name, element.value) |
| 115 | } |
| 116 | } |
| 117 | } |
| 118 | return data |
| 119 | } |
| 120 | |
| 121 | /** |
| 122 | * Add a value to an object, creating an array to place it in if needed. |
no test coverage detected