সিরিয়ালাইজ জাভাস্ক্রিপ্ট গঠন (কোনও কাঠামো নেই)


141

ভাবছি জাভাস্ক্রিপ্টে jquery বা কোনও ফ্রেমওয়ার্ক ছাড়াই কোনও ফাংশন রয়েছে যা আমাকে ফর্মটি সিরিয়ালায়িত করতে এবং সিরিয়ালাইজড সংস্করণটি অ্যাক্সেস করতে দেয়?


1
"ক্রমিক সংস্করণ অ্যাক্সেস" বলতে আপনার অর্থ কী? : আমি একটি স্ক্রিপ্ট কোন 3rd পার্টি নির্ভরতা যে বস্তুর মত একটি JSON- যা বহুমাত্রিক হয় মধ্যে এইচটিএমএল ফর্ম রূপান্তর করতে পারেন যে গড়ে তুলেছি github.com/serbanghita/formToObject যদি এটি একটি উত্তর ড্রপ সহায়তা করে -
Şerban ঘিটা

উত্তর:


39

ক্ষুদ্রতর থেকে সিরিয়াল লাইব্রেরি কোনও ফ্রেমওয়ার্কের উপর নির্ভর করে না। এই জাতীয় কিছু ব্যতীত, আপনাকে নিজেরাই ক্রমিক ক্রিয়াকলাপ বাস্তবায়ন করতে হবে। (যদিও ১.২ কিলোবাইটের ওজনে, কেন এটি ব্যবহার করবেন না?)


2
এটি নিখুঁত ছিল। তবে case 'email':
কোডটির

ওহ, এখন আমি দেখছি, গুগলেকোড জাভাস্ক্রিপ্ট ছাড়া কাজ করে না। এটি কেবল থুতু দেয়That's an error
ব্যবহারকারী 1040495

3
দয়া করে কিছু লাইব্রেরির লিঙ্ক নয়, কিছু কোড অন্তর্ভুক্ত করুন। লাইব্রেরি যদি ওপেন সোর্স হয় তবে আপনার উচিত প্রাসঙ্গিক কোডটি অনুলিপি করতে।
লুক 19

171

খাঁটি জাভাস্ক্রিপ্ট পদ্ধতিটি এখানে:

var form = document.querySelector('form');
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);

যদিও এটি কেবল পোস্ট অনুরোধের জন্য কাজ করছে বলে মনে হচ্ছে।

https://developer.mozilla.org/en-US/docs/Web/API/FormData


13
দ্রষ্টব্য, এটি মাল্টিপার্টটি প্রেরণ করে যা কিছু সাধারণ আরএসটি পরিষেবা (যেমন পালক-মঙ্গোডিবি)
জেসন ম্যাককারেল

আমি মনে করি আপনি ঠিক বলেছেন যে এটি কেবল পোস্ট অনুরোধের সাথেই কাজ করে। এটি ডক্স থেকে তাত্ক্ষণিকভাবে পরিষ্কার ছিল না।
মানিশা

এটি আমার পক্ষে কাজ করে না। ফর্ম গভীরভাবে বাসা বাঁধে। ফর্মডাটা অবজেক্টটি খালি…
চিৎসুই

দ্রষ্টব্য, আপনার req.open("POST", "<your-url>");আগে এটি ব্যবহার করতে হতে পারে req.send(data);অন্যথায় আমার InvalidStateError: XMLHttpRequest state must be OPENED.ফায়ারফক্স on 66 এ ত্রুটি ছিল It এটি অন্যান্য অনুরোধগুলির সাথেও কাজ করা উচিত যেমন PUT আপনি PUT এর সাথে POST প্রতিস্থাপন করেন।
ব্যাপটেক্স

1
এটি সম্পর্কে চিন্তা করুন: আপনি কীভাবে "জিইটি" পদ্ধতিটি ব্যবহার করে একটি ফর্মডাটা অবজেক্ট পাঠাতে পারেন? হ্যাঁ, ফর্মডেটা কেবলমাত্র "পোস্ট" দিয়ে কাজ করে।
রেক্স আশ্চর্য

88

শুধুমাত্র আধুনিক ব্রাউজারগুলির জন্য

আপনি ব্রাউজারে সমর্থন লক্ষ্যমাত্রা রাখেন, তাহলে URLSearchParamsএপিআই ( সাম্প্রতিকতম ব্রাউজার ) এবং FormData(formElement)কন্সট্রাক্টর ( সাম্প্রতিকতম ব্রাউজার এজ ছাড়া ) এই ব্যবহার করুন:

new URLSearchParams(new FormData(formElement)).toString()

আইই বাদে সর্বত্র

যে ব্রাউজারগুলি সমর্থন করে URLSearchParamsতবে FormData(formElement)নির্মাণকারী নয়, এই ফর্মডাটা পলিফিল এবং এই কোডটি ব্যবহার করুন ( আইআই বাদে সর্বত্র কাজ করে):

new URLSearchParams(Array.from(new FormData(formElement))).toString()

উদাহরণ

আইই 10 এর সাথে সামঞ্জস্যপূর্ণ

এমনকি পুরানো ব্রাউজারগুলির জন্য (যেমন আইই 10), ফর্মডাটা পলিফিল , প্রয়োজনে একটি Array.fromপলফিল এবং এই কোডটি ব্যবহার করুন:

Array.from(
  new FormData(formElement),
  e => e.map(encodeURIComponent).join('=')
).join('&')

.toString()এখানে কি সত্যিই প্রয়োজনীয়?
অলি উইলিয়ামস

1
আপনি যদি একটি স্ট্রিং চান এবং না URLSearchParams, তবে হ্যাঁ। স্ট্রিং রূপান্তরটিও স্পষ্টভাবে ঘটে যদি আপনি কোনও স্ট্রিংকে ইন্টারপোল্ট করে বা যোগ করেন তবে এই ক্ষেত্রে সুস্পষ্ট toStringকলের প্রয়োজন নেই।
glebm

ওয়ান-লাইনার এপ্রিল 2018 হিসাবে আইওএস সাফারিতে আমার পক্ষে কাজ করেনি
jchook

আপনি কোন ত্রুটি পেয়েছেন এবং এটি সাফারিটির কোন সংস্করণ? সম্ভবত new FormData(formElement)এখনও সেখানে সমর্থন করা হয় না?
glebm

@glebm হ্যাঁ এটি সাফারিতে সমর্থিত নয়, আপনি কি অন্য কোনও সমাধান খুঁজে পেয়েছেন?
ishষি আগর

34
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.js


1
সেই সিরিয়ালাইজেশনটি স্ট্যান্ডার্ড ফর্ম সিরিয়ালাইজেশনের সাথে সামঞ্জস্যপূর্ণ বলে মনে হয় না, যেখানে স্পেসগুলি "+" দ্বারা প্রতিনিধিত্ব করা হয়। উপরেরটিগুলি কেবল এনকোডিউআরআইসি কম্পোনেন্ট ব্যবহার করে , যা স্থানটি "% 20" হিসাবে এনকোড করবে। যদি কনফারেন্সের প্রয়োজন হয়, ট্রান্সমিশনের আগে "% 20" কে "+" রূপান্তর করতে একটি নিয়মিত অভিব্যক্তি শেষে ব্যবহার করা যেতে পারে।
রবজি

3
আমি gist.github.com/brettz9/7147458 (কিছু অন্যান্য উন্নতি সহ) এ জাতীয় সংশোধিত সংস্করণ যুক্ত করেছি
ব্রেট জামির

3
জমা বোতামগুলি অগত্যা জমা দেওয়া উচিত নয়, রিসেট বোতামগুলি কখনই জমা দেওয়া উচিত নয় এবং কেবল যেখানে বোতাম জমা দেওয়ার জন্য ব্যবহৃত হয় এবং সে ক্ষেত্রে সাবমিট বাটন হিসাবে বিবেচিত হবে। দেখুন HTML5 এর 4.10.22 ফরম জমা
রবজি

ইনপুট টাইপ ইমেল সিরিয়ালাইজ করবেন না।
ইভান

24

এখানে টিবিটিবসের সামান্য পরিবর্তিত সংস্করণ রয়েছে:

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, '+');
}

অক্ষম ক্ষেত্রগুলি বাতিল করা হয় এবং নামগুলি ইউআরএল এনকোড করাও থাকে। % 20 অক্ষরের রিজেক্স প্রতিস্থাপন স্ট্রিংটি ফেরার আগে একবারই হয়।

JQuery এর se .সরিয়ালাইজ () পদ্ধতি থেকে ফলাফলের জন্য ক্যোয়ারী স্ট্রিংটি অভিন্ন আকারে।


6
কোডটি উন্নত করার জন্য সময় দেওয়ার জন্য +1। লোকেরা যখন আমার ত্রুটিগুলি খুঁজে পায় আমি আনন্দ করি কারণ এটি একটি ভাল শিক্ষার সুযোগ। এটি দেখতে দেখতে সুন্দর লাগার জন্য +1। -1 কারণ আমি +2 = দিতে পারি না (
টিবিটিবস

1
আপনি এর form.nodeName.toLowerCase() == "form"পরিবর্তে যোগ করতে পারেনform.nodeName == "FORM"
স্টেফানচঞ্চ

12

আমি জেন্ডাভা ডেকানো থেকে উত্তরটি দিয়ে শুরু করেছি।

এটি তার ফাংশনের জবাবে উল্লিখিত কয়েকটি সমস্যা সমাধান করা উচিত।

  1. % 20 কে + চিহ্ন সহ প্রতিস্থাপন করুন।
  2. জমা / বোতামের প্রকারগুলি কেবল তখনই জমা দেওয়া হবে যখন তারা ফর্মটি জমা দেওয়ার জন্য ক্লিক করা হয়েছিল।
  3. রিসেট বোতাম উপেক্ষা করা হবে।
  4. কোডটি আমার কাছে অপ্রয়োজনীয় বলে মনে হচ্ছে যেহেতু ক্ষেত্রের ধরণ নির্বিশেষে মূলত একই জিনিসটি করছে। এইচটিএমএল 5 ফিল্ডের ধরণের যেমন 'টেল' এবং 'ইমেল' এর সাথে অসঙ্গতি উল্লেখ না করা, আমি স্যুইচ স্টেটমেন্টগুলির সাহায্যে বেশিরভাগ সুনির্দিষ্ট সরিয়ে দিয়েছি।

বোতামের ধরণের নামগুলির মূল্য না থাকলে এখনও তা উপেক্ষা করা হবে।

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))">

6
সুন্দরভাবে রিফ্যাক্টর কোডের জন্য +1। অক্ষম ক্ষেত্রগুলিকে উপেক্ষা করার জন্য -1, যা কোয়েরি স্ট্রিংয়ে উপস্থিত হওয়া উচিত নয়। বিবৃতিতে খুব মার্জিত জন্য +1, যা ফর্ম উপাদানগুলির পুনরাবৃত্তি গণনা এড়ায়। মোট: +1 :-) ধন্যবাদ!
সাইমন স্টেইনবার্গার

প্রতিবন্ধী ক্ষেত্রগুলি সম্পর্কে ভাল দ্রষ্টব্য, আমি সম্প্রতি লিখছি এমন একটি নতুন ফাংশন নিয়ে আমি এতে প্রবেশ করি। আপনার দুজনের কাছেই +1, কারণ আমি মজাদার মন্তব্য পড়তে উপভোগ করি। :)
টিবিটিবস

11

আপনার যদি জেসন ফর্ম্যাটে পোষ্ট ব্যবহার করে "মাইফর্ম" ফর্মটি জমা করতে হয় তবে আপনি এটি করতে পারেন:

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 ... }

... এটি একটি মানচিত্রফ্র্যানে অ্যারে.ফ্রমে () এ যাওয়ার মাধ্যমে এই রূপান্তরটি করে। এই মানচিত্রএফএন প্রতিটি ["a", "b"] জোড়াতে প্রয়োগ করা হয় এবং এগুলিকে {"a": "b" into তে রূপান্তরিত করে যাতে অ্যারেটিতে প্রতিটিতে একটি করে সম্পত্তি থাকা অনেকগুলি অবজেক্ট থাকে। জোড়ের প্রথম এবং দ্বিতীয় অংশের নাম পেতে মানচিত্রএফএন "ডিস্ট্রাকচারিং" ব্যবহার করছে এবং মানচিত্রএফএন দ্বারা প্রত্যাবর্তিত অবজেক্টে সম্পত্তিটির নাম নির্ধারণের জন্য এটি একটি ES6 "কমপিউটেডপ্রটিটির নাম "ও ব্যবহার করছে (এই কারণেই বলা হয়েছে" [ x]: কেবল "x: কিছু" এর চেয়ে কিছু "।

এই সমস্ত একক সম্পত্তি বস্তুগুলি তারপরে অবজেক্ট.স্যাসাইন () ফাংশনের আর্গুমেন্টগুলিতে প্রেরণ করা হয় যা সমস্ত একক সম্পত্তি অবজেক্টগুলিকে একক বস্তুতে মার্জ করে যা সমস্ত বৈশিষ্ট্যযুক্ত।

অ্যারে.ফ্রোম (): https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অ্যারে / ফ্রম

প্যারামিটারগুলিতে বিকাশ: https://simonsmith.io/destructuring-objects-as-function-paraters-in-es6/

এখানে গণনা করা সম্পত্তির নাম সম্পর্কে আরও: একটি জাভাস্ক্রিপ্ট অবজেক্ট আক্ষরিক সম্পত্তি হিসাবে নাম পরিবর্তনশীল?


এটি আমার পক্ষে কাজ করে যদি আমি দ্বিতীয় লাইনটি না বুঝতে পারি তবে আপনি কি এটি সম্পর্কে আরও তথ্য দিতে পারবেন ??
এস্পোয়ার মুরহাবাজি

স্প্রেড অপারেটর এবং নেটিভ অবজেক্ট এবং অ্যারে পদ্ধতিগুলি ব্যবহার করে সুন্দর উত্তর।
ভিনি ফনসেকা

মনে রাখবেন যে এই পদ্ধতিটি আইই (.entries ()) এ সমর্থিত নয়
dude

অবজেক্ট.এন্ট্রি () এর এমডিএন পৃষ্ঠায় একটি সংক্ষিপ্ত পলিফিল রয়েছে যা আপনি আইই ব্যবহার করতে পারেন: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / but তবে আইআই স্প্রেড অপারেটরকে সমর্থন করে না।
মোলসন

আপনি নতুন পদ্ধতি অবজেক্ট.ফর্মএন্ট্রি (নতুন ফর্মডেটা (মাইফর্মএলেটমেন্ট)) ব্যবহার করে ফর্মটি সিরিয়ালাইজ করতে পারেন।
মাইগুয়েল সেভিগানো

10

সমস্ত ব্রাউজারে কাজ করে।

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>


এইটি জাসন তৈরি করে, আমি ধরে নিই যে লেখক ইউআরআইতে সিরিয়ালিংয়ের বিষয়ে জিজ্ঞাসা করেছিলেন।
jaskmar

আমি একাধিক নির্বাচনের বিকল্প ফর্মগুলির জন্য এটি কাজ করতে দেখতে পছন্দ করব।
জ্যাচ স্মিথ

@ জাকস্মিথ এটি ইতিমধ্যে কাজ করেছে, তবে এটি পরীক্ষা করার জন্য আমি একটি উদাহরণ যুক্ত করেছি
ডেভিড লেমন

8
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();

আমি আশা করি আমি সাহায্য করেছি।


3
চেকবক্সগুলি নিয়ে কাজ করবে না। এখানে, আপনাকে অবশ্যই ইনপুট ধরণের স্পষ্ট করে চেক করতে হবে।
অ্যাড্রিয়ান Preuss

5

আপনি যদি কোনও ইভেন্টের ইনপুটগুলিকে সিরিয়ালাইজ করতে খুঁজছেন। এখানে আমি ব্যবহার করি এমন একটি খাঁটি জাভাস্ক্রিপ্ট পদ্ধতির।

// serialize form
var data = {};
var inputs = [].slice.call(e.target.getElementsByTagName('input'));
inputs.forEach(input => {
  data[input.name] = input.value;
});

ডেটা ইনপুটগুলির একটি জাভাস্ক্রিপ্ট অবজেক্ট হবে।


2
এটি বেশিরভাগ উপাদানগুলিতে কাজ করা উচিত। নিশ্চিতভাবে না পাঠ্য এলাকা /, নির্বাচন যদিও
jaggedsoft

যে slice.call অ্যারে.ফর্ম হিসাবে একই?
ব্যবহারকারী 1040495

5

@ সাইমনস্টাইনবার্গারের কোডটির একটি রিফ্যাক্টরড সংস্করণ কম ভেরিয়েবল ব্যবহার করে এবং forEachলুপগুলির গতির সুবিধা গ্রহণ করে (যা এর চেয়ে কিছুটা দ্রুত for)

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, '+');
}

3

আমি টিবিটিবসের উত্তরটি এমন কিছুতে রিফেক্টর করেছি যা পড়ার জন্য আরও পরিষ্কার। ৮০ টি চরিত্রের প্রস্থ এবং কয়েকটি মন্তব্যের কারণে এটি কিছুটা দীর্ঘ।

অতিরিক্তভাবে, এটি ফাঁকা ক্ষেত্রের নাম এবং ফাঁকা মানগুলিকে উপেক্ষা করে।

// 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);
}

আমি সরাসরি আমার অ্যাপ্লিকেশন এবং এই কপি একাধিক-নির্বাচন (মান সদৃশ হয়) কাজ বলে মনে হচ্ছে না
anastymous

ক্যান্সার করার জন্য ধন্যবাদ, এটি ঠিক করা হয়েছে
ব্রায়ান এডমন্ডস

হাই ব্রায়ান, এফেক্ট কি ? এবং এর জন্য আমার কী করা উচিত? ফায়ারফক্স আমাকে বলছে যে এটি সংজ্ঞায়িত হয়নি।
এনিস্টেমাস

হাই অ্যানাস্টিমাস, আবার ধরা পড়ার জন্য ধন্যবাদ, এটি নির্ধারণের জন্য অ্যাসাইনমেন্টটি পরিবর্তন করে ঠিক করা উচিত evt = evt || window.event || { target: null };(সম্পাদনাটি যেমন হয়েছে) এর পিছনের মূল বিষয়টি হ'ল সিরিয়ালাইজেশনকে সূচিতকারী ইভেন্টটি পাস করা, যদি কোনও ফর্মের মতো "জমা দিন" ইভেন্ট, বা একটি বোতামের "ক্লিক"। যদি কোনও ফর্মের জমা দেওয়ার জন্য একাধিক বোতাম থাকে, আপনি কেবল ইভেন্টটি ট্রিগারকারী বোতামটির মূল্যের জন্য অ্যাকাউন্ট করতে চান এবং অন্যদের উপেক্ষা করেন। আমি ডাম্পবেডমন্ডস.নেট
ব্রায়ান এডমন্ডস

2
  // 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);

2

আমি @moison উত্তর থেকে এন্ট্রি ধরলাম থাকেন () formData পদ্ধতি থেকে MDN এটা যে বলা হয়ে থাকে:

ফর্মডাটা.এন্ট্রি () পদ্ধতিটি এই অবজেক্টটিতে থাকা সমস্ত কী / মান জোড়গুলির মধ্য দিয়ে যাওয়ার জন্য একটি পুনরাবৃত্তিকে ফেরত দেয়। প্রতিটি জুটির চাবি একটি ইউএসভিস্ট্রিং অবজেক্ট; মানটি হয় ইউএসভিস্ট্রিং, বা একটি ব্লব।

তবে একমাত্র সমস্যা হ'ল মোবাইল ব্রাউজার (অ্যান্ড্রয়েড এবং সাফারি সমর্থিত নয়) এবং আইই এবং সাফারি ডেস্কটপও

তবে মূলত আমার পদ্ধতির এখানে:

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'

};

কোডটি এখানে পাওয়া যাবে


2

জাভাস্ক্রিপ্ট হ্রাস ফাংশন ব্যবহার করে আইআই 9> সহ সমস্ত ব্রাউজারের জন্য একটি কৌশল করা উচিত:

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;
 },[]);

লাইভ উদাহরণ নমুনা।


এটি একাধিক নির্বাচনের জন্য কাজ করে? মনে হয় যখন আমি আপনার কোড ব্যবহার করি এটি একাধিক নির্বাচিত বিকল্প মানের প্রথম আইটেমটি ফিরিয়ে দেয়
জ্যাচ স্মিথ

@ জাচস্মিথ আমি একাধিক নির্বাচিত উপাদান অন্তর্ভুক্ত করার জন্য আমার উত্তর আপডেট করেছি।
ক্র্যাশটেস্টএক্সএক্সএক্সএক্স

0

আমি আশা করি এটি কার্যকর হবে

var serializeForm = (formElement) => {
  const formData = {};
  const inputs = formElement.elements;

  for (let i = 0; i < inputs.length; i++) {
    if(inputs[i].name!=="")
        formData[inputs[i].name] = inputs[i].value;
  }
  return formData;
}

0

ডেভিড লেমন এর উত্তর উন্নতি।

এটি ফর্ম ডেটাটিকে 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>


0

এটি নিম্নলিখিত হিসাবে খুব সাধারণ ফাংশন দ্বারা করা যেতে পারে

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>


0

খাঁটি জাভাস্ক্রিপ্ট পদ্ধতিটি এখানে:

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);
}

-1
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;
}

ঝরঝরে দেখায়, তবে এটি রেডিও বোতাম বা চেকবক্সগুলিকে বিবেচনায় নেয় না
ইয়ভোন আবুরো

-1

ডিবাগিং উদ্দেশ্যে এটি আপনাকে সহায়তা করতে পারে:

function print_form_data(form) {
    const form_data = new FormData(form);

    for (const item of form_data.entries()) {
        console.log(item);
    }

    return false;
}

-1

আমি পাগল হতে পারি তবে আমি এই উত্তরগুলি গুরুতরভাবে ফুলে উঠছি। এখানে আমার সমাধান

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এবং সমস্ত
জ্যাচ স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.