Apakah ada cara sederhana, satu-baris untuk mendapatkan data formulir seperti jika akan dikirimkan dengan cara klasik HTML saja?
Sebagai contoh:
<form>
<input type="radio" name="foo" value="1" checked="checked" />
<input type="radio" name="foo" value="0" />
<input name="bar" value="xxx" />
<select name="this">
<option value="hi" selected="selected">Hi</option>
<option value="ho">Ho</option>
</form>
Keluaran:
{
"foo": "1",
"bar": "xxx",
"this": "hi"
}
Sesuatu seperti ini terlalu sederhana, karena tidak (dengan benar) memasukkan teks, pilihan, tombol radio dan kotak centang:
$("#form input").each(function () {
data[theFieldName] = theFieldValue;
});
javascript
jquery
forms
Bart van Heukelom
sumber
sumber
Jawaban:
demo
sumber
_.object($("#myform").serializeArray().map(function(v) {return [v.name, v.value];} ))
Gunakan
$('form').serializeArray()
, yang mengembalikan array :Opsi lainnya adalah
$('form').serialize()
, yang mengembalikan string :Lihatlah demo jsfiddle ini
sumber
serializeArray
akan jauh lebih berguna jika mengembalikan objek dengan pasangan kunci-nilainame="multiple[]"
tidak berfungsi. Solusi untuk metode POST adalah sama, cukup gunakan $ ('form'). Serialize (). Juga metode POST tidak memiliki batas 2000 karakter seperti halnya GET di sebagian besar browser, sehingga dapat digunakan bahkan untuk data yang cukup besar.name
atribut.Jawaban yang diperbarui untuk 2014: HTML5 FormData melakukan ini
Anda kemudian dapat memposting formData persis seperti itu - itu berisi semua nama dan nilai yang digunakan dalam formulir.
sumber
entries()
metode [halaman MDN ].Berdasarkan
jQuery.serializeArray
, mengembalikan pasangan nilai kunci.sumber
Ini adalah jawaban yang membingungkan, tetapi izinkan saya menjelaskan mengapa ini adalah solusi yang lebih baik:
Kami benar menangani pengiriman formulir daripada menekan tombol. Beberapa orang suka menekan enter pada bidang. Beberapa orang menggunakan perangkat input alternatif seperti input ucapan atau perangkat aksesibilitas lainnya. Menangani formulir kirim dan Anda menyelesaikannya dengan benar untuk semua orang.
Kami sedang menggali data formulir untuk formulir aktual yang dikirimkan. Jika Anda mengubah pemilih formulir Anda nanti, Anda tidak perlu mengubah pemilih untuk semua bidang. Selain itu, Anda mungkin memiliki beberapa formulir dengan nama input yang sama. Tidak perlu bingung dengan ID yang berlebihan dan yang tidak, cukup lacak input berdasarkan formulir yang dikirimkan. Ini juga memungkinkan Anda untuk menggunakan penangan peristiwa tunggal untuk berbagai bentuk jika itu sesuai untuk situasi Anda.
Antarmuka FormData cukup baru, tetapi didukung dengan baik oleh browser. Ini cara yang bagus untuk membangun pengumpulan data untuk mendapatkan nilai nyata dari apa yang ada di formulir. Tanpa itu, Anda harus mengulang semua elemen (seperti dengan
form.elements
) dan mencari tahu apa yang diperiksa, apa yang tidak, apa nilainya, dll. Sangat mungkin jika Anda memerlukan dukungan browser lama, tetapi FormData antarmuka lebih sederhana.Saya menggunakan ES6 di sini ... bukan persyaratan dengan cara apa pun, jadi ubah kembali agar kompatibel dengan ES5 jika Anda memerlukan dukungan browser lama.
sumber
formData.entries()
.formData.foo
tidak ditentukan. Seperti yang terlihat dalam jawaban Anda,.get()
perlu dipanggil untuk apa yang menurut saya tidak nyaman. Mungkin "tidak mengekspos" datang dengan cara yang salah. Jadi, untuk menghasilkan sesuatu seperti{ foo: 'bar' }
dari suatusubmit
acara, Anda perlu mengulanginya secara manual. Karena itu. To get a plain object from it, see [link]
.xhr.send(formData);
JSON.stringify([...formData])
Atau, jika Anda ingin kunci / nilai Anda terpisah ...[...formData].reduce((prev, cur) => { prev[cur[0]] = cur[1]; return prev;}, {})
gunakan .serializeArray () untuk mendapatkan data dalam format array dan kemudian mengubahnya menjadi objek:
sumber
<input type="checkbox" name="someList" value="one" /> <input type="checkbox" name="someList" value="two" />
. Jika keduanya dicentang, objek hanya berisi nilai kotak centang kedua.someList
seharusnyatype="radio"
?name:value
Inilah soluton yang sangat sederhana dan singkat yang bahkan tidak memerlukan Jquery.
sumber
postData
.Ini tahun 2019 dan ada cara yang lebih baik untuk melakukan ini:
atau jika Anda menginginkan Obyek polos sebagai gantinya
meskipun perhatikan bahwa ini tidak akan berfungsi dengan kunci duplikat seperti yang Anda dapatkan dari kotak centang multi-pilih dan duplikat dengan nama yang sama.
sumber
document.getElementsByClassName
dan untuk loop tetapi hei, masih lebih bagus daripada memerlukan jQuery dlldocument.querySelector
bukan hanyaquerySelector
.sumber
selain itu, Anda mungkin ingin melihat serialize () ;
sumber
Saya menggunakan ini:
Plugin jQuery
Formulir HTML
Dapatkan Data
sumber
Array
Berikut ini adalah implementasi hanya JavaScript yang berfungsi dengan benar menangani kotak centang, tombol radio, dan slider (mungkin tipe input lain juga, tapi saya hanya menguji ini).
Contoh kerja:
edit:
Jika Anda mencari implementasi yang lebih lengkap, maka lihatlah bagian dari proyek yang saya buat ini . Saya akan memperbarui pertanyaan ini pada akhirnya dengan solusi lengkap yang saya buat, tetapi mungkin ini akan membantu seseorang.
sumber
Jika Anda menggunakan jQuery, berikut adalah sedikit fungsi yang akan melakukan apa yang Anda cari.
Pertama, tambahkan ID ke formulir Anda (kecuali jika itu adalah satu-satunya formulir pada halaman, maka Anda bisa menggunakan 'formulir' sebagai permintaan dom)
Outputnya akan terlihat seperti:
sumber
Anda juga bisa menggunakan Objek FormData ; Objek FormData memungkinkan Anda mengkompilasi satu set pasangan kunci / nilai untuk dikirim menggunakan XMLHttpRequest. Ini terutama dimaksudkan untuk digunakan dalam mengirim data formulir, tetapi dapat digunakan secara independen dari formulir untuk mengirimkan data kunci.
sumber
Ini akan menambahkan semua bidang formulir ke objek JavaScript "res":
sumber
Saya telah menyertakan jawaban untuk juga memberikan kembali objek yang diperlukan.
sumber
foo[bar][] = 'qux'
harus bersambung ke{ foo: { bar: [ 'qux' ] } }
.Berdasarkan respons neuront, saya membuat metode JQuery sederhana yang mendapatkan formulir data dalam pasangan nilai kunci tetapi berfungsi untuk multi-seleksi dan untuk input array dengan nama = 'example []'.
Beginilah cara ini digunakan:
Anda dapat menemukan contoh di bawah ini tentang definisi dan cara kerjanya.
sumber
sumber
sumber
Anda dapat menggunakan fungsi ini untuk memiliki objek atau JSON dari formulir.
untuk menggunakannya:
sumber
Saya menulis perpustakaan untuk mengatasi masalah ini: JSONForms . Dibutuhkan formulir, melewati setiap input dan membangun objek JSON yang dapat Anda baca dengan mudah.
Katakanlah Anda memiliki formulir berikut:
Melewati formulir ke metode penyandian JSONForms mengembalikan Anda objek berikut:
Ini demo dengan formulir Anda.
sumber
Codepen
sumber
Bagi Anda yang lebih suka yang
Object
bertentangan dengan string serial (seperti yang dikembalikan oleh$(form).serialize()
, dan sedikit perbaikan$(form).serializeArray()
), jangan ragu untuk menggunakan kode di bawah ini:Untuk menjalankannya, cukup gunakan
Form.serialize(form)
dan fungsinya akan mengembalikan yangObject
serupa dengan ini:Sebagai bonus, itu berarti Anda tidak perlu menginstal seluruh bundel jQuery hanya untuk satu fungsi serialisasi.
sumber
Saya menulis fungsi yang menangani beberapa kotak centang dan beberapa pilihan. Dalam kasus itu mengembalikan array.
sumber
menampilkan kolom isian form input dan file input untuk mengirimkan form Anda tanpa me-refresh halaman dan ambil semua nilai dengan file yang termasuk di dalamnya
sumber
Ini akan memperbaiki masalah: tidak dapat bekerja dengan multiselek.
sumber
Anda semua tidak sepenuhnya benar. Anda tidak dapat menulis:
Karena dengan cara ini jika Anda memiliki daftar multiselect - nilainya akan ditimpa dengan yang terakhir, karena ditransmisikan sebagai: "param1": "value1", "param1": "value2".
Jadi, pendekatan yang benar adalah:
sumber
Metode ini harus melakukannya. Ini membuat cerita berseri data formulir dan kemudian mengubahnya menjadi objek. Mengurus kelompok kotak centang juga.
sumber
name
atribut.Berikut adalah fungsi JS vanilla yang bagus yang saya tulis untuk mengekstrak data formulir sebagai objek. Ini juga memiliki opsi untuk memasukkan tambahan ke objek, dan untuk membersihkan bidang input formulir.
Berikut ini adalah contoh penggunaannya dengan permintaan pos:
sumber