आश्चर्य है कि जावास्क्रिप्ट या किसी भी ढांचे के बिना जावास्क्रिप्ट में एक फ़ंक्शन है जो मुझे प्रपत्र को क्रमबद्ध करने और क्रमबद्ध संस्करण तक पहुंचने की अनुमति देता है?
आश्चर्य है कि जावास्क्रिप्ट या किसी भी ढांचे के बिना जावास्क्रिप्ट में एक फ़ंक्शन है जो मुझे प्रपत्र को क्रमबद्ध करने और क्रमबद्ध संस्करण तक पहुंचने की अनुमति देता है?
जवाबों:
लघु -क्रमबद्ध पुस्तकालय से एक रूपरेखा पर भरोसा नहीं होता है। ऐसा कुछ के अलावा, आपको क्रमबद्धता फ़ंक्शन को स्वयं लागू करना होगा। (हालांकि 1.2 किलोबाइट के वजन पर, इसका उपयोग क्यों नहीं किया गया?)
case 'email':
कोड के इनपुट अनुभाग में एक जोड़ना था
That's an error
यहाँ शुद्ध जावास्क्रिप्ट दृष्टिकोण है:
var form = document.querySelector('form');
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);
हालांकि यह केवल POST अनुरोधों के लिए काम कर रहा है।
req.open("POST", "<your-url>");
पहले उपयोग करना पड़ सकता है req.send(data);
अन्यथा मुझे InvalidStateError: XMLHttpRequest state must be OPENED.
फ़ायरफ़ॉक्स 66 पर त्रुटि हुई। इसे अन्य अनुरोधों के साथ काम करना चाहिए जैसे कि PUT क्या आप POST को PUT से बदल सकते हैं।
आप ब्राउज़रों कि समर्थन को लक्षित करते हैं URLSearchParams
एपीआई ( सबसे हाल ही में ब्राउज़रों ) और FormData(formElement)
निर्माता ( सबसे हाल ही में ब्राउज़रों एज को छोड़कर ), इस का उपयोग करें:
new URLSearchParams(new FormData(formElement)).toString()
उन ब्राउज़रों के लिए जो समर्थन करते हैं, URLSearchParams
लेकिन निर्माता नहीं FormData(formElement)
, इस फॉर्मडैट पॉलीफ़िल और इस कोड का उपयोग करें (IE को छोड़कर हर जगह काम करता है)
new URLSearchParams(Array.from(new FormData(formElement))).toString()
यहां तक कि पुराने ब्राउज़रों (उदाहरण के लिए IE 10) के लिए, फॉर्मडाटा पॉलीफिल , पॉलीफिल का उपयोग करें Array.from
यदि आवश्यक हो और यह कोड:
Array.from(
new FormData(formElement),
e => e.map(encodeURIComponent).join('=')
).join('&')
.toString()
वास्तव में यहाँ आवश्यक है?
URLSearchParams
, तो हाँ। स्ट्रिंग रूपांतरण भी अंतर्निहित रूप से होता है यदि आप इसे एक स्ट्रिंग में जोड़ते हैं या जोड़ते हैं, तो उस स्थिति में स्पष्ट toString
कॉल आवश्यक नहीं है।
new FormData(formElement)
वहाँ अभी तक समर्थित नहीं है?
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 'tel':
case 'email':
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("&");
}
स्रोत: http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.ds
यहाँ 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, '+');
}
अक्षम फ़ील्ड को छोड़ दिया जाता है और नाम भी URL एन्कोडेड होते हैं। स्ट्रिंग को वापस करने से पहले, रेगेक्स का% 20 अक्षरों का स्थान केवल एक बार होता है।
क्वेरी स्ट्रिंग jQuery के $ .serialize () विधि से परिणाम के समान रूप में है।
form.nodeName.toLowerCase() == "form"
इसके बजाय जोड़ सकते हैंform.nodeName == "FORM"
मैंने जॉन्डेव डेकोनो के जवाब के साथ शुरुआत की।
यह उनके फ़ंक्शन के उत्तरों में वर्णित कुछ समस्याओं को ठीक करना चाहिए।
यदि उनके पास कोई नाम मान नहीं है तो बटन प्रकारों को अभी भी अनदेखा किया जाएगा।
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);
}
इस समय मैं इस फ़ंक्शन का उपयोग कर रहा हूं।
<form onsubmit="myAjax('http://example.com/services/email.php', 'POST', serialize(this, event))">
यदि आपको json फॉर्मेट में POST का उपयोग करके "myForm" फॉर्म जमा करने की आवश्यकता है, तो आप कर सकते हैं:
const formEntries = new FormData(myForm).entries();
const json = Object.assign(...Array.from(formEntries, ([x,y]) => ({[x]:y})));
fetch('/api/foo', {
method: 'POST',
body: JSON.stringify(json)
});
दूसरी पंक्ति एक सरणी से परिवर्तित होती है जैसे:
[["firstProp", "firstValue"], ["secondProp", "secondValue"], ...and so on... ]
... एक नियमित वस्तु में, जैसे:
{"firstProp": "firstValue", "secondProp": "secondValue", ...and so on ... }
... यह रूपांतरण को Array.from () में एक MapFn में पास करके करता है। यह मानचित्र प्रत्येक ["a", "b"] जोड़े पर लागू होता है और उन्हें {"a": "b"} में रूपांतरित करता है ताकि सरणी में प्रत्येक में केवल एक गुण वाली बहुत सी वस्तु समाहित हो जाए। MapFn जोड़ी के पहले और दूसरे हिस्सों के नाम पाने के लिए "विनाशकारी" का उपयोग कर रहा है, और यह MapFn द्वारा लौटाए गए ऑब्जेक्ट में संपत्ति का नाम सेट करने के लिए ES6 "ComputedPropertyName" का भी उपयोग कर रहा है (यह कहता है "] x]: कुछ "बजाय" x: कुछ "।
इन सभी एकल संपत्ति ऑब्जेक्ट्स को तब Object.assign () फ़ंक्शन के तर्कों में पारित किया जाता है जो सभी एकल गुण ऑब्जेक्ट्स को एकल ऑब्जेक्ट में विलय करता है जिसमें सभी गुण होते हैं।
Array.from (): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
मापदंडों में विनाशकारी: https://simonsmith.io/destructuring-objects-as-function-parameters-in-es6/
गणना की गई संपत्ति के नाम पर अधिक: जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक में संपत्ति के नाम के रूप में परिवर्तनीय?
सभी ब्राउज़रों में काम करता है।
const formSerialize = formElement => {
const values = {};
const inputs = formElement.elements;
for (let i = 0; i < inputs.length; i++) {
values[inputs[i].name] = inputs[i].value;
}
return values;
}
const dumpValues = form => () => {
const r = formSerialize(form);
console.log(r);
console.log(JSON.stringify(r));
}
const form = document.querySelector('form');
dumpValues(form)();
form.addEventListener('change',dumpValues(form));
<form action="/my-handling-form-page" method="post">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="user_name" value="John">
</div>
<div>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_mail" value="john@jonhson.j">
</div>
<div>
<label for="interests">Interest:</label>
<select required="" id="interests" name="interests">
<option value="" selected="selected">- None -</option>
<option value="drums">Drums</option>
<option value="js">Javascript</option>
<option value="sports">Sports</option>
<option value="trekking">Trekking</option>
</select>
</div>
<div>
<label for="msg">Message:</label>
<textarea id="msg" name="user_message">Hello My Friend</textarea>
</div>
</form>
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 );
}
इस तरह का उपयोग करने के लिए:
var dataToSend = document.querySelector("form").serialize();
मुझे आशा है कि मैंने मदद की होगी।
यदि आप किसी घटना पर जानकारी को क्रमबद्ध करना चाहते हैं। यहां एक शुद्ध जावास्क्रिप्ट तरीका है जिसका मैं उपयोग करता हूं।
// serialize form
var data = {};
var inputs = [].slice.call(e.target.getElementsByTagName('input'));
inputs.forEach(input => {
data[input.name] = input.value;
});
डेटा आदानों का एक जावास्क्रिप्ट ऑब्जेक्ट होगा।
कम चर का उपयोग करके और forEach
लूप की गति का लाभ उठाते हुए @ SimonSteinberger के कोड का एक परिष्कृत संस्करण (जो 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, '+');
}
मैंने टिब्बी का उत्तर उस चीज़ में दिया, जो पढ़ने में बहुत स्पष्ट है। यह 80 वर्ण चौड़ाई और कुछ टिप्पणियों के कारण थोड़ा लंबा है।
इसके अतिरिक्त, यह रिक्त फ़ील्ड नामों और रिक्त मानों को अनदेखा करता है।
// 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);
}
evt = evt || window.event || { target: null };
(जैसा कि संपादित किया गया है) इसके पीछे बिंदु उस घटना को पारित करना है जिसने क्रमांकन को ट्रिगर किया है, अगर कोई है, जैसे कि एक फॉर्म "सबमिट करें" ईवेंट, या एक बटन "क्लिक"। यदि किसी फ़ॉर्म में सबमिट करने के लिए एक से अधिक बटन हैं, तो आप केवल उस बटन के मूल्य का हिसाब लगाना चाहते हैं जिसने इवेंट को ट्रिगर किया और दूसरों को अनदेखा किया। मैंने एक साथ डंप
// supports IE8 and IE9
function serialize(form) {
var inputs = form.elements;
var array = [];
for(i=0; i < inputs.length; i++) {
var inputNameValue = inputs[i].name + '=' + inputs[i].value;
array.push(inputNameValue);
}
return array.join('&');
}
//using the serialize function written above
var form = document.getElementById("form");//get the id of your form. i am assuming the id to be named form.
var form_data = serialize(form);
var xhr = new XMLHttpRequest();
xhr.send(form_data);
//does not work with IE8 AND IE9
var form = document.querySelector('form');
var data = new FormData(form);
var xhr = new XMLHttpRequest();
xhr.send(data);
मैंने @Dison उत्तर और MDN से फॉर्मडैट की प्रविष्टियाँ () विधि पकड़ ली है, ऐसा कहा जाता है:
FormData.entries () विधि इस ऑब्जेक्ट में निहित सभी कुंजी / मान जोड़े के माध्यम से जाने के लिए एक पुनरावृत्ति देता है। प्रत्येक जोड़ी की कुंजी एक USVString ऑब्जेक्ट है; मूल्य या तो USVString, या एक बूँद है।
लेकिन एकमात्र मुद्दा यह है कि मोबाइल ब्राउज़र (एंड्रॉइड और सफारी समर्थित नहीं हैं) और IE और सफारी डेस्कटॉप भी
लेकिन मूल रूप से यहाँ मेरा दृष्टिकोण है:
let theForm = document.getElementById("contact");
theForm.onsubmit = function(event) {
event.preventDefault();
let rawData = new FormData(theForm);
let data = {};
for(let pair of rawData.entries()) {
data[pair[0]] = pair[1];
}
let contactData = JSON.stringify(data);
console.warn(contactData);
//here you can send a post request with content-type :'application.json'
};
जावास्क्रिप्ट को कम करने के लिए फ़ंक्शन का उपयोग IE9> सहित सभी ब्राउज़रों के लिए एक चाल करना चाहिए:
Array.prototype.slice.call(form.elements) // convert form elements to array
.reduce(function(acc,cur){ // reduce
var o = {type : cur.type, name : cur.name, value : cur.value}; // get needed keys
if(['checkbox','radio'].indexOf(cur.type) !==-1){
o.checked = cur.checked;
} else if(cur.type === 'select-multiple'){
o.value=[];
for(i=0;i<cur.length;i++){
o.value.push({
value : cur.options[i].value,
selected : cur.options[i].selected
});
}
}
acc.push(o);
return acc;
},[]);
लाइव उदाहरण बलो।
डेविड लेमन के जवाब में सुधार।
यह JSON में डेटा को रूपांतरित करता है और आपको डेटा ऑब्जेक्ट से फ़ॉर्म सेट करने की अनुमति देता है।
const main = () => {
const form = document.forms['info'];
const data = {
"user_name" : "John",
"user_email" : "john@jonhson.com",
"user_created" : "2020-03-24",
"user_age" : 42,
"user_subscribed" : true,
"user_interests" : "sports",
"user_message" : "Hello My Friend"
};
populateForm(form, data);
updateJsonView(form);
form.addEventListener('change', (e) => updateJsonView(form));
}
const getFieldValue = (field, opts) => {
let type = field.getAttribute('type');
if (type) {
switch (type) {
case 'checkbox':
return field.checked;
case 'number':
return field.value.includes('.')
? parseFloat(field.value)
: parseInt(field.value, 10);
}
}
if (opts && opts[field.name] && opts[field.name].type) {
switch (opts[field.name].type) {
case 'int':
return parseInt(field.value, 10);
case 'float':
return parseFloat(field.value);
}
}
return field.value;
}
const setFieldValue = (field, value) => {
let type = field.getAttribute('type');
if (type) {
switch (type) {
case 'checkbox':
field.checked = value;
break;
default:
field.value = value;
break;
}
} else {
field.value = value;
}
}
const extractFormData = (form, opts) => {
return Array.from(form.elements).reduce((data, element) => {
return Object.assign(data, { [element.name] : getFieldValue(element, opts) });
}, {});
};
const populateForm = (form, data) => {
return Array.from(form.elements).forEach((element) => {
setFieldValue(element, data[element.name]);
});
};
const updateJsonView = (form) => {
let fieldOptions = {};
let formData = extractFormData(form, fieldOptions);
let serializedData = JSON.stringify(formData, null, 2);
document.querySelector('.json-view').textContent = serializedData;
};
main();
.form-field {
margin-bottom: 0.5em;
}
.form-field label {
display: inline-block;
font-weight: bold;
width: 7em;
vertical-align: top;
}
.json-view {
position: absolute;
top: 0.667em;
right: 0.667em;
border: thin solid grey;
padding: 0.5em;
white-space: pre;
font-family: monospace;
overflow: scroll-y;
max-height: 100%;
}
<form name="info" action="/my-handling-form-page" method="post">
<div class="form-field">
<label for="name">Name:</label>
<input type="text" id="name" name="user_name">
</div>
<div class="form-field">
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email">
</div>
<div class="form-field">
<label for="created">Date of Birth:</label>
<input type="date" id="created" name="user_created">
</div>
<div class="form-field">
<label for="age">Age:</label>
<input type="number" id="age" name="user_age">
</div>
<div class="form-field">
<label for="subscribe">Subscribe:</label>
<input type="checkbox" id="subscribe" name="user_subscribed">
</div>
<div class="form-field">
<label for="interests">Interest:</label>
<select required="" id="interests" name="user_interests">
<option value="" selected="selected">- None -</option>
<option value="drums">Drums</option>
<option value="js">Javascript</option>
<option value="sports">Sports</option>
<option value="trekking">Trekking</option>
</select>
</div>
<div class="form-field">
<label for="msg">Message:</label>
<textarea id="msg" name="user_message"></textarea>
</div>
</form>
<div class="json-view"></div>
यह बहुत ही सरल कार्य द्वारा निम्नानुसार किया जा सकता है
function serialize(form) {
let requestArray = [];
form.querySelectorAll('[name]').forEach((elem) => {
requestArray.push(elem.name + '=' + elem.value);
});
if(requestArray.length > 0)
return requestArray.join('&');
else
return false;
}
serialized = serialize(document.querySelector('form'))
console.log(serialized);
<form>
<input type='text' name='fname' value='Johne'/>
<input type='text' name='lname' value='Doe'/>
<input type='text' name='contact[]' value='99999999'/>
<input type='text' name='contact[]' value='34423434345'/>
</form>
यहाँ शुद्ध जावास्क्रिप्ट दृष्टिकोण है:
var form = document.querySelector('form');
var data = new FormData(form);
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
xhttp.open("POST", "<YOUR-URL>", true);
xhttp.send(data);
}
document.serializeForm = function (selector) {
var dictionary = {};
var form = document.querySelector(selector);
var formdata = new FormData(form);
var done = false;
var iterator = formdata.entries();
do {
var prop = iterator.next();
if (prop.done && !prop.value) {
done = true;
}
else {
dictionary[prop.value[0]] = prop.value[1];
}
} while (!done);
return dictionary;
}
डीबगिंग उद्देश्यों के लिए यह आपकी मदद कर सकता है:
function print_form_data(form) {
const form_data = new FormData(form);
for (const item of form_data.entries()) {
console.log(item);
}
return false;
}
मैं पागल हो सकता था लेकिन मैं इन उत्तरों को गंभीरता से फूला हुआ पा रहा हूं। यहाँ मेरा समाधान है
function serialiseForm(form) {
var input = form.getElementsByTagName("input");
var formData = {};
for (var i = 0; i < input.length; i++) {
formData[input[i].name] = input[i].value;
}
return formData = JSON.stringify(formData);
}
select
, सभी के लिए विफल होगा