On se demande s'il y a une fonction dans javascript sans jquery ou tout cadre qui me permet de sérialiser le formulaire et d'accéder à la version de sérialisation?
Cette bibliothèque miniature ne repose pas sur un cadre. Sauf quelque chose comme ça, vous devrez implémenter la fonction de sérialisation vous-même. (Bien qu'à un poids de 1,2 kilobytes, pourquoi ne pas l'utiliser?)
Voici une approche purement JavaScript:
var form = document.querySelector('form'); var data = new FormData(form); var req = new XMLHttpRequest(); req.send(data);
Bien qu'il semble fonctionner uniquement pour les demandes POST.
function serialize (form) { if (!form || form.nodeName !== "FORM") { return; } var 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 '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; } break; case 'file': 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; } } return q.join("&"); }
Source: http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js
Voici une version légèrement modifiée de TibTibs ':
function serialize(form) { var field, s = []; if (typeof form == 'object' && form.nodeName == "FORM") { var len = form.elements.length; for (i=0; i<len; i++) { field = form.elements[i]; if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') { if (field.type == 'select-multiple') { for (j=form.elements[i].options.length-1; j>=0; j--) { if(field.options[j].selected) s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value); } } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) { s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value); } } } } return s.join('&').replace(/%20/g, '+'); }
Les champs désactivés sont ignorés et les noms sont également encodés en URL. Le remplacement Regex de% 20 caractères s'effectue une seule fois, avant de renvoyer la chaîne.
La chaîne de requête est identique au résultat de la méthode $ .serialize () de jQuery.
J'ai commencé par la réponse de Johndave Decano.
Cela devrait résoudre quelques-uns des problèmes mentionnés dans les réponses à sa fonction.
Les types de boutons seront toujours ignorés s'ils n'ont pas de valeur de nom.
function serialize(form, evt){ var evt = evt || window.event; evt.target = evt.target || evt.srcElement || null; var field, query=''; if(typeof form == 'object' && form.nodeName == "FORM"){ for(i=form.elements.length-1; i>=0; i--){ field = form.elements[i]; if(field.name && field.type != 'file' && field.type != 'reset'){ if(field.type == 'select-multiple'){ for(j=form.elements[i].options.length-1; j>=0; j--){ if(field.options[j].selected){ query += '&' + field.name + "=" + encodeURIComponent(field.options[j].value).replace(/%20/g,'+'); } } } else{ if((field.type != 'submit' && field.type != 'button') || evt.target == field){ if((field.type != 'checkbox' && field.type != 'radio') || field.checked){ query += '&' + field.name + "=" + encodeURIComponent(field.value).replace(/%20/g,'+'); } } } } } } return query.substr(1); }
C'est comme ça que j'utilise actuellement cette fonction.
<form onsubmit="myAjax('http://example.com/services/email.php', 'POST', serialize(this, event))">
Voici un modèle JavaScript moderne qui reçoit une chaîne de requête à partir d'un nœud de formulaire:
Array.from(new FormData(formElement).entries(), e => e.map(encodeURIComponent).join('=')).join('&')
Fonctionne dans tous les navigateurs modernes, y compris MS Edge (mais pas IE).
HTMLElement.prototype.serialize = function(){ var obj = {}; var elements = this.querySelectorAll( "input, select, textarea" ); for( var i = 0; i < elements.length; ++i ) { var element = elements[i]; var name = element.name; var value = element.value; if( name ) { obj[ name ] = value; } } return JSON.stringify( obj ); }
Pour utiliser comme ceci:
var dataToSend = document.querySelector("form").serialize();
J'espère avoir aidé.
Si vous cherchez à sérialiser les entrées d'un événement. Voici une approche pure JavaScript que j'utilise.
// serialize form var data = {}; var inputs = [].slice.call(e.target.getElementsByTagName('input')); inputs.forEach(input => { data[input.name] = input.value; });
Les données seront un objet JavaScript des entrées.
Une version révisée du code @ SimonSteinberger utilisant moins de variables et profitant de la vitesse des boucles de forEach
boucle (qui sont un peu plus rapide que for
s)
function serialize(form) { var result = []; if (typeof form === 'object' && form.nodeName === 'FORM') Array.prototype.slice.call(form.elements).forEach(function(control) { if ( control.name && !control.disabled && ['file', 'reset', 'submit', 'button'].indexOf(control.type) === -1 ) if (control.type === 'select-multiple') Array.prototype.slice.call(control.options).forEach(function(option) { if (option.selected) result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(option.value)); }); else if ( ['checkbox', 'radio'].indexOf(control.type) === -1 || control.checked ) result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(control.value)); }); return result.join('&').replace(/%20/g, '+'); }
J'ai refacturé la réponse de TibTibs dans quelque chose qui est beaucoup plus clair à lire. C'est un peu plus long en raison de la largeur de 80 caractères et de quelques commentaires.
En outre, il ignore les noms de champs vierges et les valeurs vides.
// Serialize the specified form into a query string. // // Returns a blank string if +form+ is not actually a form element. function $serialize(form, evt) { if(typeof(form) !== 'object' && form.nodeName !== "FORM") return ''; var evt = evt || window.event || { target: null }; evt.target = evt.target || evt.srcElement || null; var field, query = ''; // Transform a form field into a query-string-friendly // serialized form. // // [NOTE]: Replaces blank spaces from its standard '%20' representation // into the non-standard (though widely used) '+'. var encode = function(field, name) { if (field.disabled) return ''; return '&' + (name || field.name) + '=' + encodeURIComponent(field.value).replace(/%20/g,'+'); } // Fields without names can't be serialized. var hasName = function(el) { return (el.name && el.name.length > 0) } // Ignore the usual suspects: file inputs, reset buttons, // buttons that did not submit the form and unchecked // radio buttons and checkboxes. var ignorableField = function(el, evt) { return ((el.type == 'file' || el.type == 'reset') || ((el.type == 'submit' || el.type == 'button') && evt.target != el) || ((el.type == 'checkbox' || el.type == 'radio') && !el.checked)) } var parseMultiSelect = function(field) { var q = ''; for (var j=field.options.length-1; j>=0; j--) { if (field.options[j].selected) { q += encode(field.options[j], field.name); } } return q; }; for(i = form.elements.length - 1; i >= 0; i--) { field = form.elements[i]; if (!hasName(field) || field.value == '' || ignorableField(field, evt)) continue; query += (field.type == 'select-multiple') ? parseMultiSelect(field) : encode(field); } return (query.length == 0) ? '' : query.substr(1); }