Saya punya banyak kotak centang yang dicentang secara default. Pengguna saya mungkin akan menghapus centang pada beberapa (jika ada) dari kotak centang dan membiarkan sisanya dicentang.
Apakah ada cara untuk membuat bentuk POST kotak centang yang tidak diperiksa, daripada orang-orang yang sedang diperiksa?
checkbox
elemen yang mendasarinya mengerikan? Mereka kontrol biner, mereka harus mengirim nilai biner.Solusi yang paling saya sukai sejauh ini adalah dengan memasukkan input tersembunyi dengan nama yang sama dengan kotak centang yang mungkin tidak dicentang. Saya pikir itu berfungsi sehingga jika kotak centang tidak dicentang, input tersembunyi masih berhasil dan dikirim ke server tetapi jika kotak centang dicentang akan menimpa input tersembunyi sebelum itu. Dengan cara ini Anda tidak perlu melacak nilai mana dalam data yang diposkan yang diharapkan berasal dari kotak centang.
sumber
Saya menyelesaikannya dengan menggunakan vanilla JavaScript:
Hati-hati jangan sampai ada spasi atau garis pemisah di antara dua elemen input ini!
Kamu bisa memakai
this.previousSibling.previousSibling
untuk mendapatkan elemen "atas".Dengan PHP Anda dapat memeriksa bidang tersembunyi bernama untuk 0 (tidak disetel) atau 1 (set).
sumber
<fieldset name='fs1'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset> <fieldset name='fs2'> <input type="text" name="somefield[]"> <input type="checkbox" name="live[]"> </fieldset>
* Asumsikan ada baris baru di sana. Mereka tampaknya tidak bekerja di blok kode mini-markuppreviousElementSibling
bukanpreviousSibling
. Ini didukung hampir di mana-mana , dan mengabaikan node teks.Favorit pribadi saya adalah menambahkan bidang tersembunyi dengan nama yang sama yang akan digunakan jika kotak centang tidak dicentang. Tetapi solusinya tidak semudah kelihatannya.
Jika Anda menambahkan kode ini:
Peramban tidak akan terlalu peduli dengan apa yang Anda lakukan di sini. Browser akan mengirim kedua parameter ke server, dan server harus memutuskan apa yang harus dilakukan dengan mereka.
PHP misalnya mengambil nilai terakhir sebagai yang akan digunakan (lihat: Posisi otoritatif dari duplikat kunci permintaan HTTP GET )
Tetapi sistem lain yang bekerja dengan saya (berdasarkan Java) melakukannya dengan cara lain - mereka hanya memberi Anda nilai pertama. .NET sebagai gantinya akan memberi Anda array dengan kedua elemen sebagai gantinya
Saya akan mencoba menguji ini dengan node.js, Python dan Perl kapan-kapan.
sumber
request.getParameterValues
Teknik umum untuk ini adalah membawa variabel tersembunyi bersama dengan masing-masing kotak centang.
Di sisi server, pertama-tama kami mendeteksi daftar variabel tersembunyi dan untuk setiap variabel tersembunyi, kami mencoba untuk melihat apakah entri kotak centang yang sesuai dikirimkan dalam formulir data atau tidak.
Algoritma sisi server mungkin akan terlihat seperti:
Di atas tidak persis menjawab pertanyaan, tetapi menyediakan cara alternatif untuk mencapai fungsi serupa.
sumber
Anda tidak perlu membuat bidang tersembunyi untuk semua kotak centang, cukup salin kode saya. itu akan mengubah nilai kotak centang jika tidak dicentang
value
akan menetapkan0
dan jika kotak centang dicentang kemudian menetapkanvalue
ke1
sumber
Jika Anda meninggalkan nama kotak centang itu tidak lulus. Hanya array test_checkbox.
sumber
Anda dapat melakukan beberapa Javascript di acara pengiriman formulir. Hanya itu yang bisa Anda lakukan, tidak ada cara untuk membuat browser melakukan ini sendiri. Ini juga berarti formulir Anda akan rusak untuk pengguna tanpa Javascript. Lebih baik untuk mengetahui di server yang ada kotak centang, sehingga Anda dapat menyimpulkan bahwa mereka yang absen dari nilai formulir yang diposting (
$_POST
dalam PHP) tidak dicentang.sumber
$_REQUEST
adalah praktik yang baik karena memungkinkan beberapa kode digunakan kembali jika skrip Anda mendukung kedua metode.Saya sebenarnya akan melakukan hal berikut.
Memiliki bidang input tersembunyi saya dengan nama yang sama dengan input kotak centang
dan kemudian ketika saya memposting saya pertama-tama menghapus nilai duplikat yang diambil dalam array $ _POST, pilih yang menampilkan masing-masing nilai unik.
Saya mendapatkan ini dari sebuah postingan menghapus nilai duplikat dari array
sumber
checkbox_name[]
setiap nilai akan dimasukkan ke dalam array, yang kemudian dapat Anda tarik. Mis:$_POST['checkbox_name'][0]
dan seterusnya dengan penambahan berapa banyak bidang yang memiliki nama yang sama. Contoh lain adalah jika Anda memiliki tiga bidang bernamafield_name[]
Anda bisa mendapatkan nilaifield_name
suka yang kedua$_POST['field_name'][1]
. Tujuannya bisa luar biasa jika Anda memiliki beberapa bidang dengan nama yang sama."Saya telah pergi dengan pendekatan server. Tampaknya bekerja dengan baik - terima kasih. - reach4thelasers. Seperti dikutip: solusi javascript tergantung pada bagaimana server handler (saya tidak memeriksanya)
seperti
sumber
Saya tahu pertanyaan ini berumur 3 tahun tetapi saya menemukan solusi yang menurut saya cukup baik.
Anda dapat melakukan pemeriksaan apakah variabel $ _POST ditetapkan dan menyimpannya dalam variabel.
fungsi isset () memeriksa apakah variabel $ _POST diberikan. Secara logika jika tidak ditetapkan maka kotak centang tidak dicentang.
sumber
Sebagian besar jawaban di sini membutuhkan penggunaan JavaScript atau kontrol input rangkap. Kadang-kadang ini perlu ditangani sepenuhnya di sisi server.
Saya percaya kunci (yang dimaksudkan) untuk memecahkan masalah umum ini adalah kontrol input pengiriman formulir.
Untuk menafsirkan dan menangani nilai yang tidak dicentang untuk kotak centang berhasil, Anda harus memiliki pengetahuan tentang hal berikut:
Dengan memeriksa apakah formulir dikirimkan (nilai diberikan ke elemen input pengiriman), nilai kotak centang yang tidak dicentang dapat diasumsikan .
Sebagai contoh:
Saat menggunakan PHP, cukup sepele untuk mendeteksi kotak centang mana yang dicentang.
Data awal dapat dimuat pada setiap pemuatan halaman, tetapi harus dimodifikasi hanya jika formulir dikirimkan. Karena nama-nama kotak centang sudah diketahui sebelumnya, mereka dapat dilalui dan diperiksa secara individual, sehingga tidak adanya nilai-nilai individualnya menunjukkan bahwa mereka tidak dicentang.
sumber
Saya sudah mencoba versi Sam dulu. Ide bagus, tetapi menyebabkan ada beberapa elemen dalam bentuk dengan nama yang sama. Jika Anda menggunakan javascript apa pun yang menemukan elemen berdasarkan nama, itu sekarang akan mengembalikan array elemen.
Saya telah mengerjakan ide Shailesh dalam PHP, itu berhasil untuk saya. Ini kode saya:
sumber
Saya juga suka solusi yang baru saja Anda posting kolom input tambahan, menggunakan JavaScript sepertinya sedikit membingungkan bagi saya.
Tergantung pada apa yang Anda gunakan untuk backend Anda akan tergantung pada input mana yang lebih dulu.
Untuk server backend tempat kejadian pertama kali digunakan (JSP) Anda harus melakukan hal berikut.
Untuk server backend tempat kejadian terakhir digunakan (PHP, Rails) Anda harus melakukan hal berikut.
Untuk server backend tempat semua kejadian disimpan dalam daftar tipe data (
[]
,array
). (Python / Zope)Anda dapat memposting sesuai pesanan yang Anda suka, Anda hanya perlu mencoba untuk mendapatkan nilai dari input dengan
checkbox
atribut type. Jadi indeks pertama dari daftar jika kotak centang sebelum elemen tersembunyi dan indeks terakhir jika kotak centang setelah elemen tersembunyi.Untuk server backend di mana semua kejadian disatukan dengan koma (ASP.NET / IIS) Anda akan perlu (split / meledak) string dengan menggunakan koma sebagai pembatas untuk membuat tipe data daftar. (
[]
)Sekarang Anda dapat mencoba untuk mengambil indeks pertama dari daftar jika kotak centang sebelum elemen tersembunyi dan ambil indeks terakhir jika kotak centang setelah elemen tersembunyi.
sumber gambar
sumber
Saya menggunakan blok jQuery ini, yang akan menambahkan input tersembunyi pada waktu-kirim ke setiap kotak centang yang tidak dicentang. Ini akan menjamin Anda selalu mendapatkan nilai yang dikirimkan untuk setiap kotak centang, setiap saat, tanpa mengacaukan markup Anda dan berisiko lupa melakukannya pada kotak centang yang Anda tambahkan nanti. Ini juga agnostik untuk tumpukan backend apa pun (PHP, Ruby, dll.) Yang Anda gunakan.
sumber
Anda juga dapat mencegat acara form.smit dan membalikkan cek sebelum mengirim
sumber
Saya melihat pertanyaan ini sudah tua dan memiliki banyak jawaban, tetapi saya tetap akan memberikan uang saya. Pilihan saya adalah untuk solusi javascript pada acara 'ajukan' formulir, seperti yang ditunjukkan beberapa orang. Tidak menggandakan input (terutama jika Anda memiliki nama panjang dan atribut dengan kode php dicampur dengan html), tidak ada sisi server yang mengganggu (yang akan perlu mengetahui semua nama bidang dan memeriksanya satu per satu), cukup ambil semua item yang tidak dicentang , berikan mereka nilai 0 (atau apa pun yang Anda butuhkan untuk menunjukkan status 'tidak dicentang') dan kemudian ubah atributnya 'dicentang' menjadi true
dengan cara ini Anda akan memiliki array $ _POST seperti ini:
sumber
sumber
Apa yang saya lakukan agak berbeda. Pertama, saya mengubah nilai dari semua kotak centang yang tidak dicentang. Untuk "0", lalu pilih semuanya, sehingga nilainya akan diserahkan.
sumber
Saya lebih suka menyusun $ _POST
itu keberatan, jika POST tidak memiliki nilai 'checkboxname', itu tidak dicentang jadi, beri nilai.
Anda dapat membuat array nilai kotak centang Anda dan membuat fungsi yang memeriksa apakah ada nilai, jika tidak, itu keberatan yang tidak dicentang dan Anda dapat menetapkan suatu nilai
sumber
Contoh pada tindakan Ajax adalah (': dicentang') menggunakan jQuery alih-alih .val ();
params akan mendapatkan nilai dalam TRUE OR FALSE ..
sumber
Kotak centang biasanya mewakili data biner yang disimpan dalam database sebagai nilai Ya / Tidak, Y / N atau 1/0. Kotak centang HTML memiliki sifat buruk untuk mengirim nilai ke server hanya jika kotak centang dicentang! Itu berarti bahwa skrip server di situs lain harus mengetahui terlebih dahulu apa saja kotak centang yang mungkin pada halaman web agar dapat menyimpan nilai-nilai positif (dicentang) atau negatif (tidak dicentang). Sebenarnya hanya nilai negatif yang menjadi masalah (ketika pengguna menghapus centang sebelumnya (pra) nilai yang diperiksa - bagaimana server dapat mengetahui hal ini ketika tidak ada yang dikirim jika tidak tahu sebelumnya bahwa nama ini harus dikirim). Jika Anda memiliki skrip sisi server yang secara dinamis membuat skrip UPDATE ada masalah karena Anda tidak tahu semua kotak centang harus diterima untuk menetapkan nilai Y untuk dicentang dan nilai N untuk yang tidak dicentang (tidak diterima).
Karena saya menyimpan nilai 'Y' dan 'N' di database saya dan mewakilinya melalui kotak centang dicentang dan tidak dicentang di halaman, saya menambahkan bidang tersembunyi untuk setiap nilai (kotak centang) dengan nilai 'Y' dan 'N' kemudian menggunakan kotak centang hanya untuk visual representasi, dan gunakan cek fungsi JavaScript sederhana () untuk menetapkan nilai jika menurut pilihan.
gunakan satu JavaScript onclick listener dan fungsi panggilan cek () untuk setiap kotak centang di halaman web saya:
Dengan cara ini nilai 'Y' atau 'N' selalu dikirim ke skrip sisi server, ia tahu bidang apa yang harus diperbarui dan tidak perlu konversi checbox "on" nilai menjadi 'Y' atau tidak menerima kotak centang ke 'N' '
CATATAN: spasi putih atau baris baru juga merupakan saudara kandung, jadi di sini saya perlu .previousSibling.previousSibling.value. Jika tidak ada ruang di antara hanya .previousSibling.value
Anda tidak perlu menambahkan onclick listener secara eksplisit seperti sebelumnya, Anda dapat menggunakan jQuery library untuk secara dinamis menambahkan listener klik dengan fungsi untuk mengubah nilai ke semua kotak centang di halaman Anda:
sumber
Semua jawaban bagus, tetapi jika Anda memiliki beberapa kotak centang dalam formulir dengan nama yang sama dan Anda ingin memposting status setiap kotak centang. Kemudian saya telah memecahkan masalah ini dengan menempatkan bidang tersembunyi dengan kotak centang (nama yang terkait dengan apa yang saya inginkan).
kemudian kendalikan status perubahan kotak centang dengan kode jquery di bawah ini:
sekarang pada perubahan kotak centang apa pun, itu akan mengubah nilai bidang tersembunyi terkait. Dan di server Anda hanya dapat melihat ke bidang tersembunyi dan bukan kotak centang.
Semoga ini bisa membantu seseorang mengalami masalah seperti ini. bersorak :)
sumber
Masalah dengan kotak centang adalah bahwa jika mereka tidak dicentang maka mereka tidak diposting dengan formulir Anda. Jika Anda mencentang kotak centang dan memposting formulir, Anda akan mendapatkan nilai kotak centang dalam variabel $ _POST yang dapat Anda gunakan untuk memproses formulir, jika tidak dicentang, tidak ada nilai yang akan ditambahkan ke variabel $ _POST.
Dalam PHP Anda biasanya mengatasi masalah ini dengan melakukan pemeriksaan isset () pada elemen kotak centang Anda. Jika elemen yang Anda harapkan tidak disetel dalam variabel $ _POST maka kita tahu bahwa kotak centang tidak dicentang dan nilainya bisa salah.
Tetapi jika Anda telah membuat formulir dinamis maka Anda tidak akan selalu tahu atribut nama dari kotak centang Anda, jika Anda tidak tahu nama kotak centang maka Anda tidak dapat menggunakan fungsi penerbit untuk memeriksa apakah ini telah dikirim dengan variabel $ _POST.
sumber
sumber
Ada solusi yang lebih baik. Pertama-tama berikan atribut nama hanya pada kotak centang yang dicentang. Kemudian pada klik
submit
, melalui JavaScriptfunction
Anda mencentang semua kotak yang tidak dicentang. Jadi ketika Andasubmit
hanya mereka yang akan diambil padaform collection
mereka yang memilikiname
properti.Keuntungan: Tidak perlu membuat kotak tersembunyi tambahan, dan memanipulasinya.
sumber
@ cpburnz melakukannya dengan benar tetapi untuk banyak kode, berikut adalah ide yang sama menggunakan lebih sedikit kode
JS:
HTML (perhatikan nama bidang menggunakan nama array):
Dan untuk PHP:
sumber
Versi jQuery dari jawaban @ vishnu.
Jika Anda menggunakan jQuery 1.5 atau di bawah, silakan gunakan fungsi .attr () alih-alih .prop ()
sumber
Solusi ini terinspirasi oleh @ desw's.
Jika nama input Anda berada dalam "style form", Anda akan kehilangan asosiasi indeks array dengan nilai chekbox Anda segera setelah satu chekbox diperiksa, menambah "disosiasi" ini dengan satu unit setiap kali chekbox diperiksa. Ini bisa menjadi kasus formulir untuk memasukkan sesuatu seperti karyawan yang disusun oleh beberapa bidang, misalnya:
Jika Anda memasukkan tiga karyawan sekaligus dan yang pertama dan yang kedua adalah tunggal, Anda akan mendapatkan 5 elemen
isSingle
array , sehingga Anda tidak akan dapat mengulangi sekaligus melalui tiga array untuk, misalnya , masukkan karyawan ke dalam basis data.Anda dapat mengatasinya dengan beberapa postprocessing array yang mudah. Saya menggunakan PHP di sisi server dan saya melakukan ini:
sumber
Jadi solusi ini berlebihan untuk pertanyaan ini, tetapi itu membantu saya ketika saya memiliki kotak centang yang sama yang terjadi berkali-kali untuk baris berbeda dalam sebuah tabel. Saya perlu mengetahui baris yang diwakili kotak centang dan juga mengetahui status kotak centang (dicentang / tidak dicentang).
Apa yang saya lakukan adalah menghapus atribut nama dari input kotak centang saya, memberi mereka semua kelas yang sama, dan membuat input tersembunyi yang akan menampung JSON yang setara dengan data.
HTML
Javascript untuk dijalankan pada formulir kirim
String json akan diteruskan dengan formulir sebagai $ _POST ["memiliki-izin-nilai"]. Dalam PHP, decode string ke dalam array dan Anda akan memiliki array asosiatif yang memiliki setiap baris dan nilai true / false untuk setiap kotak centang yang sesuai. Maka sangat mudah untuk berjalan dan membandingkan dengan nilai-nilai database saat ini.
sumber