form serileştirme javascript (çerçeve yok)


141

Javascript jquery veya form serileştirmek ve serileştirilmiş sürümü erişmek için herhangi bir çerçeve olmadan bir işlevi var mı?


1
"Serileştirme versiyonuna eriş" ile ne demek istiyorsun? HTML formunu çok boyutlu olan JSON benzeri bir nesneye dönüştürebilen hiçbir üçüncü taraf bağımlılığı olmayan bir komut dosyası geliştirdim: github.com/serbanghita/formToObject - bir yanıt bırakmaya yardımcı olursa
Șerban Ghiță

Yanıtlar:


39

Serileşen seri minyatür kütüphanesi bir çerçeveye dayanmaz. Bunun gibi bir şey dışında, serileştirme işlevini kendiniz uygulamanız gerekir. (1,2 kilobayt ağırlığında olsa da, neden kullanmıyorsunuz?)


2
Bu mükemmeldi. Ama case 'email':kodun giriş bölümüne bir eklemek zorunda
aravind

oh, şimdi görüyorum, googlecode javascript olmadan çalışmıyor. Sadece tükürürThat's an error
user1040495

3
Lütfen sadece bir kütüphaneye bağlantı değil, bazı kodlar ekleyin. Kütüphane açık kaynaksa, ilgili kodun üzerine kopyalayabilmeniz gerekir.
Luke

171

İşte saf JavaScript yaklaşımı:

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

Rağmen sadece POST istekleri için çalışıyor gibi görünüyor.

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


13
Bu, bazı basit REST hizmetleriyle (yani tüyler-mongoDB) kötü çalışan çok parçalı gönderir
Jason McCarrell

Bence sadece POST istekleri ile çalışıyor. Bu dokümanlardan hemen belli değildi.
manisha

bu benim için çalışmıyor. Form derinden yuvalanmıştır. FormData nesnesi boş…
chitzui

Not, daha req.open("POST", "<your-url>");önce kullanmak req.send(data);zorunda kalabilirsiniz Aksi takdirde InvalidStateError: XMLHttpRequest state must be OPENED.Firefox 66 üzerinde hata vardı. PUT gibi POST yerine PUT gibi diğer istekleri ile çalışması gerekir.
baptx

1
Bir düşünün: "GET" yöntemini kullanarak bir FormData nesnesini nasıl gönderebilirsiniz? Evet, FormData yalnızca "POST" ile çalışır.
Rex the Strange

88

Yalnızca modern tarayıcılar için

URLSearchParamsAPI'yı ( en son tarayıcılar ) ve FormData(formElement)yapıcıyı ( Edge hariç en son tarayıcılar ) destekleyen tarayıcıları hedefliyorsanız , bunu kullanın:

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

IE hariç her yer

Yapıcıyı destekleyen URLSearchParamsancak desteklemeyen tarayıcılar için FormData(formElement), bu FormData çoklu dolgusunu ve bu kodu kullanın (IE dışında her yerde çalışır):

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

Misal

IE 10 ile uyumlu

Daha eski tarayıcılarda bile (örneğin IE 10) FormData çoklu dolgusunu , Array.fromgerekirse bir çoklu dolguyu ve bu kodu kullanın:

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

Burada .toString()gerçekten gerekli mi?
Ollie Williams

1
Bir dize istiyor ve istemiyorsanız URLSearchParams, evet. Dize dönüştürme ayrıca bir dizeye enterpolasyon yaparsanız veya bir dizeye eklerseniz örtük olarak gerçekleşir, bu durumda açık toStringçağrı gerekli değildir.
glebm

Tek astarı yoktu değil Nisan 2018 tarihinden itibaren iOS Safari benim için çalışmak
jchook

Hangi hatayı alıyorsunuz ve Safari'nin hangi sürümü var? Belki new FormData(formElement)henüz orada desteklenmiyor mu?
glebm

@glebm yes Safari'de desteklenmiyor, başka bir çözüm buldunuz mu?
rishiAgar

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("&");
}

Kaynak: http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js


1
Bu serileştirme, boşlukların "+" ile gösterildiği standart form serileştirme ile uyumlu görünmüyor. Yukarıdaki sadece alanı "% 20" olarak kodlayacak encodeURIComponent kullanır . Uyumluluk gerekiyorsa, iletimden önce "% 20" yi "+" değerine dönüştürmek için sonunda normal bir ifade kullanılabilir.
RobG

3
Gist.github.com/brettz9/7147458'e (diğer bazı iyileştirmelerle) böyle değiştirilmiş bir versiyon ekledim
Brett Zamir

3
Gönder düğmeleri mutlaka gönderilmemeli, sıfırlama düğmeleri hiçbir zaman gönderilmemeli ve yalnızca gönderme için kullanıldıkları ve bu durumda bir gönderme düğmesi olarak değerlendirildiği düğmeler. Bkz. HTML5 4.10.22 Form gönderme .
RobG

giriş türü e-postasını serileştirmeyin.
Ivan

25

İşte TibTibs'in biraz değiştirilmiş bir versiyonu:

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

Devre dışı bırakılan alanlar atılır ve adlar da URL kodludur. % 20 karakterin normal ifadesinin değiştirilmesi, dizeyi döndürmeden önce yalnızca bir kez gerçekleşir.

Sorgu dizesi, jQuery'nin $ .serialize () yönteminin sonucuyla aynı biçimdedir.


6
Kodu geliştirmek için zaman ayırdığınız için +1. İnsanlar kusurlarımı bulduğunda hoşuma gidiyor, çünkü bu iyi bir öğrenme fırsatı. Güzel görünmesi için +1. -1 çünkü +2 veremem = (
TibTibs

1
form.nodeName.toLowerCase() == "form"yerine ekleyebilirsinizform.nodeName == "FORM"
StefanNch

12

Johndave Decano'nun cevabı ile başladım.

Bu, işlevine verilen yanıtlarda belirtilen sorunlardan birkaçını düzeltmelidir.

  1. % 20 yerine + sembolü ekleyin.
  2. Gönder / Düğme türleri yalnızca formu göndermek için tıklandıklarında gönderilir.
  3. Sıfırlama düğmeleri yok sayılır.
  4. Alan türlerinden bağımsız olarak esasen aynı şeyi yaptığı için kod bana gereksiz görünüyordu. 'Tel' ve 'e-posta' gibi HTML5 alan türleriyle uyumsuzluktan bahsetmiyorum, bu yüzden switch deyimleriyle özelliklerin çoğunu kaldırdım.

Bir ad değeri yoksa, düğme türleri göz ardı edilir.

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

Şu anda bu işlevi kullanıyorum.

<form onsubmit="myAjax('http://example.com/services/email.php', 'POST', serialize(this, event))">

6
Güzelce yeniden düzenlenmiş kod için +1. -1, sorgu dizesinde görünmemesi gereken devre dışı alanları göz ardı etmek için. Form öğelerinin tekrarlı sayımını önleyen çok zarif ifade için +1. Toplam: +1 :-) Teşekkürler!
Simon Steinberger

Engellilerle ilgili iyi bir not, son zamanlarda yazdığım yeni bir işlevle karşılaştım. Her ikinize de +1, çünkü eğlenceli yorumları okumaktan zevk alıyorum. :)
TibTibs

11

POST kullanarak json biçiminde "myForm" formunu göndermeniz gerekiyorsa şunları yapabilirsiniz:

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

İkinci satır aşağıdaki gibi bir diziden dönüştürülür:

[["firstProp", "firstValue"], ["secondProp", "secondValue"], ...and so on... ]

... normal bir nesneye, örneğin:

{"firstProp": "firstValue", "secondProp": "secondValue", ...and so on ... }

... bu dönüşümü bir mapFn'yi Array.from () 'a aktararak yapar. Bu mapFn, her ["a", "b"] çiftine uygulanır ve bunları {"a": "b"} biçimine dönüştürür; böylece dizi, her birinde yalnızca bir özelliğe sahip çok sayıda nesne içerir. MapFn, çiftin ilk ve ikinci bölümlerinin adlarını almak için "yıkım" kullanır ve ayrıca mapFn tarafından döndürülen nesnede özellik adını ayarlamak için bir ES6 "ComputedPropertyName" kullanır (bu yüzden "[ x]: "x: bir şey" yerine "bir şey".

Bu tek özellik nesnelerinin tümü daha sonra tüm tek özellik nesnelerini tüm özelliklere sahip tek bir nesnede birleştiren Object.assign () işlevinin bağımsız değişkenlerine geçirilir.

Array.from (): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

Parametrelerde yıkım: https://simonsmith.io/destructuring-objects-as-function-parameters-in-es6/

Hesaplanan özellik adları hakkında daha fazla bilgi: Bir JavaScript nesnesi değişmezinde özellik adı olarak değişken mi?


İkinci satırı anlamadım bile benim için çalışıyor, lütfen daha fazla bilgi verebilir misiniz ??
Espoir Murhabazi

Yayılma operatörü ve yerel Nesne ve Dizi yöntemlerini kullanarak güzel yanıt.
Vinny Fonseca

Bu yaklaşımın IE'de desteklenmediğini unutmayın (.entries ())
dude

Object.entries () için MDN sayfasında IE için kullanabileceğiniz kısa bir çoklu dolgu vardır: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ancak IE de yayılma operatörünü desteklemez.
molsson

yeni bir nesne Object.fromEntries (yeni FormData (myFormElement)) kullanarak formu serileştirebilirsiniz.
miguel savignano

10

Tüm tarayıcılarda çalışır.

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>


Bu json yapar, yazarın URI serileştirme hakkında sorduğunu varsayalım.
jaskmar

Birden fazla seçenek seçenekleri formları için bu çalışma görmek isterim.
Zach Smith

@ZachSmith Zaten çalıştı, ama kontrol etmeniz için bir örnek ekledim
David Lemon

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

Bunun gibi kullanmak için:

var dataToSend = document.querySelector("form").serialize();

Umarım yardımcı olmuşumdur.


3
Onay kutuları ile çalışmaz. Burada, giriş türünü açıkça kontrol etmelisiniz.
Adrian Preuss

5

Bir olaydaki girişleri serileştirmek istiyorsanız. İşte kullandığım saf bir JavaScript yaklaşımı.

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

Veriler, girdilerin bir JavaScript nesnesi olacaktır.


2
Bu, çoğu öğe üzerinde çalışmalıdır. Kesinlikle textarea / select değil
jaggedsoft

slice.call Array.from ile aynı mıdır?
user1040495

5

@ SimonSteinberger'in kodunun daha az değişken kullanan ve forEachdöngülerin hızından yararlanan ( fors'den biraz daha hızlı olan ) yeniden düzenlenmiş bir sürümü

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

TibTibs'in cevabını okunması çok daha açık bir şeye yeniden düzenledim. 80 karakter genişliği ve birkaç yorum nedeniyle biraz daha uzun.

Ayrıca, boş alan adlarını ve boş değerleri yok sayar.

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

Bunu doğrudan uygulamama kopyaladım ve çoklu seçim işe yaramıyor (değerler çoğaltılıyor)
23

@anastymous Yakaladığınız için teşekkürler, düzeltildi.
Brian Edmonds

Merhaba Brian, ne için evt ? ve bunun için ne geçmeliyim? Firefox bana bunun tanımlanmadığını söylüyor.
anastymous

Merhaba anastymous, yakalamak için tekrar teşekkürler, bu tahliye atama değiştirilerek düzeltilmelidir evt = evt || window.event || { target: null };(düzenleme yapıldığı gibi) Bunun arkasındaki nokta, eğer bir form gibi, seri hale getirmeyi tetikleyen olayı geçmektir "gönder" etkinliği veya bir düğmenin "tıklaması". Bir formun gönderilmek üzere birden çok düğmesi varsa, yalnızca olayı tetikleyen düğmenin değerini hesaba katmak ve diğerlerini yoksaymak istersiniz. Ben dump.bedmonds.net/serialize-js
Brian Edmonds

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 yanıt ve MDN formData girişleri () yöntem yakaladım ki şöyle dedi:

FormData.entries () yöntemi, bu nesnede bulunan tüm anahtar / değer çiftlerinden geçmesine izin veren bir yineleyici döndürür. Her çiftin anahtarı USVString nesnesidir; değer bir USVString veya bir Blob.

ancak tek sorun mobil tarayıcı (android ve safari desteklenmiyor) ve IE ve Safari masaüstünün de

ama temelde benim yaklaşımım:

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'

};

kod burada bulunabilir


2

JavaScript azaltma işlevinin kullanılması, IE9> dahil tüm tarayıcılar için bir hile yapmalıdır:

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

Canlı örnek feryat.


bu çoklu seçim için işe yarıyor mu? kodunuzu kullandığınızda, birden fazla seçili seçenek değerinin yalnızca ilk öğesini döndürür gibi görünüyor
Zach Smith 16

@ZachSmith Yanıtımı birden çok seçme öğesi içerecek şekilde güncelledim.
crashtestxxx

0

Umarım bu işe yarar

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

David Lemon'un cevabını geliştirmek.

Bu, form verilerini JSON'a dönüştürür ve formu bir veri nesnesinden ayarlamanızı sağlar.

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

Bu çok basit bir fonksiyonla aşağıdaki gibi yapılabilir

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

İşte saf JavaScript yaklaşımı:

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

Düzgün görünüyor, ancak radyo düğmelerini veya onay kutularını dikkate
almıyor

-1

Hata ayıklama amacıyla bu size yardımcı olabilir:

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

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

    return false;
}

-1

Delirmiş olabilirim ama bu cevapları ciddi şekilde şişkin buluyorum. İşte benim çözümüm

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

giriş türüne göre öğeleri almak için formunuzu temel almak select, hepsi için başarısız olur
Zach Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.