Skip to content

Instantly share code, notes, and snippets.

@Semdevmaster
Last active October 9, 2018 14:54
Show Gist options
  • Select an option

  • Save Semdevmaster/c2229b9eb143ce02604fc6874a7e5542 to your computer and use it in GitHub Desktop.

Select an option

Save Semdevmaster/c2229b9eb143ce02604fc6874a7e5542 to your computer and use it in GitHub Desktop.
get data from form element
export const isValidElement = element => {
return element.name && (element.value || element.value === '')
}
export const isValidValue = element => {
return (!['checkbox', 'radio'].includes(element.type) || element.checked)
}
export const isCheckbox = element => element.type === 'checkbox'
export const isRadioButton = element => element.type === 'radio'
export const isMultiSelect = element => element.options && element.multiple
export const isSameName = element => !isCheckbox(element) && !isMultiSelect(element) && !isRadioButton(element) && element.form.elements[element.name].length
export const getSelectValues = options => [].reduce.call(options, (values, option) => {
return option.selected ? values.concat(option.value) : values
}, [])
export const dataToObject = elements => [].reduce.call(elements, (data, element) => {
if (isValidElement(element) && isValidValue(element)) {
if (isCheckbox(element)) {
data[element.name] = (data[element.name] || []).concat(element.value)
} else if (isMultiSelect(element)) {
data[element.name] = getSelectValues(element)
}
else if (isSameName(element)) {
data[element.name] = (data[element.name] || []).concat(element.value)
}
else {
data[element.name] = element.value
}
}
return data
}, {})
/*example
import * as CustomFormData from './customFormData.js'
document.querySelector('#super-form').addEventListener('submit', (e) => {
e.preventDefault()
const data = CustomFormData.formToJSON(e.target.elements)
axios({
method: 'put',
headers: {'X-Requested-With': 'XMLHttpRequest'},
url: e.target.action,
params: data
})
})
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment