Skip to content

Instantly share code, notes, and snippets.

@lucakiebel
Last active May 4, 2018 11:41
Show Gist options
  • Save lucakiebel/54e6c7d84457d66f89d1b0d00dc661cf to your computer and use it in GitHub Desktop.
Save lucakiebel/54e6c7d84457d66f89d1b0d00dc661cf to your computer and use it in GitHub Desktop.
Serialize a HTML form without the use of further libraries (no jQuery, no underscore)
function serialize(form, spaceToPlus = false) {
if (!form || form.nodeName !== "FORM") {
return;
}
let i, j, q = [];
for (i = form.elements.length - 1; i >= 0; i = i - 1) {
if (form.elements[i].name === "") {
continue;
}
switch (form.elements[i].nodeName) {
case 'INPUT':
switch (form.elements[i].type) {
case 'text':
case 'hidden':
case 'password':
case 'email':
case 'number':
case 'button':
case 'reset':
case 'submit':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
case 'checkbox':
case 'radio':
if (form.elements[i].checked) {
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
}
break;
case 'file':
break;
}
break;
case 'TEXTAREA':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value))
break;
case 'SELECT':
switch (form.elements[i].type) {
case 'select-one':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
case 'select-multiple':
for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
if (form.elements[i].options[j].selected) {
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
}
}
break;
}
break;
case 'BUTTON':
switch (form.elements[i].type) {
case 'reset':
case 'submit':
case 'button':
q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
break;
}
break;
}
}
if (spaceToPlus === true) {
q = q.map(e => e.replace("%20", "+"));
}
return q.join("&");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment