Di halaman berikut, dengan Firefox tombol hapus mengirimkan formulir, tetapi tombol tambahkan tidak. Bagaimana cara mencegah tombol hapus mengirimkan formulir?
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function addItem() {
var v = $('form :hidden:last').attr('name');
var n = /(.*)input/.exec(v);
var newPrefix;
if (n[1].length == 0) {
newPrefix = '1';
} else {
newPrefix = parseInt(n[1]) + 1;
}
var oldElem = $('form tr:last');
var newElem = oldElem.clone(true);
var lastHidden = $('form :hidden:last');
lastHidden.val(newPrefix);
var pat = '=\"' + n[1] + 'input';
newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"' + newPrefix + 'input'));
newElem.appendTo('table');
$('form :hidden:last').val('');
}
function removeItem() {
var rows = $('form tr');
if (rows.length > 2) {
rows[rows.length - 1].html('');
$('form :hidden:last').val('');
} else {
alert('Cannot remove any more rows');
}
}
</script>
</head>
<body>
<form autocomplete="off" method="post" action="">
<p>Title:<input type="text" /></p>
<button onclick="addItem(); return false;">Add Item</button>
<button onclick="removeItem(); return false;">Remove Last Item</button>
<table>
<th>Name</th>
<tr>
<td><input type="text" id="input1" name="input1" /></td>
<td><input type="hidden" id="input2" name="input2" /></td>
</tr>
</table>
<input id="submit" type="submit" name="submit" value="Submit">
</form>
</body>
</html>
Jawaban:
Anda menggunakan elemen tombol HTML5. Ingat alasannya adalah tombol ini memiliki perilaku pengiriman default, sebagaimana dinyatakan dalam spesifikasi W3 seperti yang terlihat di sini: Tombol W3C HTML5
Jadi, Anda perlu menentukan jenisnya secara eksplisit:
untuk mengganti jenis pengiriman default. Saya hanya ingin menunjukkan alasan mengapa ini terjadi =)
=)
sumber
Setel jenis pada tombol Anda:
... yang akan mencegah mereka memicu tindakan kirim saat pengecualian terjadi pada pengendali event. Lalu, perbaiki
removeItem()
fungsi Anda sehingga tidak memicu pengecualian:Perhatikan perubahan: kode asli Anda mengekstraksi elemen HTML dari set jQuery, dan kemudian mencoba memanggil metode jQuery di atasnya - ini melemparkan pengecualian, menghasilkan perilaku default untuk tombol.
FWIW, ada cara lain yang bisa Anda lakukan dengan ini ... Pasang penangan acara Anda menggunakan jQuery, dan gunakan metode preventDefault () pada objek acara jQuery untuk membatalkan perilaku default di muka:
Teknik ini menyimpan semua logika Anda di satu tempat, membuatnya lebih mudah untuk di-debug ... itu juga memungkinkan Anda untuk menerapkan back-back dengan mengubah
type
tombol kembali kesubmit
dan menangani event server-side - ini dikenal sebagai tidak mengganggu JavaScript .sumber
return false
sangat penting. kadang-kadang bahkan menggunakannya untuk tombol kirim (onclick
)Beberapa waktu yang lalu saya membutuhkan sesuatu yang sangat mirip ... dan saya mendapatkannya.
Jadi yang saya taruh di sini adalah bagaimana saya melakukan trik agar formulir dapat dikirimkan oleh JavaScript tanpa memvalidasi dan mengeksekusi validasi hanya ketika pengguna menekan tombol (biasanya tombol kirim).
Sebagai contoh saya akan menggunakan formulir minimal, hanya dengan dua bidang dan tombol kirim.
Ingat apa yang diinginkan: Dari JavaScript itu harus dapat dikirimkan tanpa pengecekan. Namun, jika pengguna menekan tombol seperti itu, validasi harus dilakukan dan formulir dikirim hanya jika melewati validasi.
Biasanya semua akan dimulai dari sesuatu di dekat ini (saya menghapus semua hal tambahan tidak penting):
Lihat bagaimana tag formulir tidak memiliki
onsubmit="..."
(ingat itu syarat untuk tidak memilikinya).Masalahnya adalah bahwa formulir selalu dikirimkan, tidak peduli apakah
onclick
kembalitrue
ataufalse
.Jika saya mengubah
type="submit"
untuktype="button"
, tampaknya bekerja tetapi tidak. Tidak pernah mengirimkan formulir, tetapi itu bisa dilakukan dengan mudah.Jadi akhirnya saya menggunakan ini:
Dan
function Validator
, di manareturn True;
, saya juga menambahkan kalimat pengiriman JavaScript, sesuatu yang mirip dengan ini:Ini
id=""
hanya untuk JavaScriptgetElementById
,name=""
itu hanya untuk itu muncul pada data POST.Cara seperti itu berfungsi seperti yang saya butuhkan.
Saya menempatkan ini hanya untuk orang-orang yang tidak memerlukan
onsubmit
fungsi pada formulir, tetapi membuat beberapa validasi ketika tombol ditekan oleh pengguna.Mengapa saya tidak perlu mengirimkan pada tag formulir? Mudah, pada bagian JavaScript lain saya perlu melakukan pengiriman tetapi saya tidak ingin ada validasi.
Alasannya: Jika pengguna adalah orang yang melakukan pengiriman, saya ingin dan perlu validasi untuk dilakukan, tetapi jika itu JavaScript, kadang-kadang saya perlu melakukan pengiriman sementara validasi seperti itu akan menghindarinya.
Ini mungkin terdengar aneh, tetapi tidak ketika berpikir misalnya: pada Login ... dengan beberapa batasan ... seperti tidak diizinkan untuk menggunakan sesi PHP dan cookie tidak diizinkan!
Jadi, tautan apa pun harus dikonversi ke formulir yang dikirimkan, sehingga data masuk tidak hilang. Ketika belum ada login, itu juga harus berfungsi. Jadi tidak ada validasi yang harus dilakukan pada tautan. Tapi saya ingin menyajikan pesan kepada pengguna jika pengguna belum memasukkan kedua bidang, pengguna dan pass. Jadi, jika ada yang hilang, formulir itu tidak boleh dikirim! ada masalahnya.
Lihat masalahnya: formulir tidak boleh dikirim ketika satu bidang kosong hanya jika pengguna telah menekan tombol, jika itu adalah kode JavaScript, ia harus dapat dikirim.
Jika saya melakukan pekerjaan pada
onsubmit
tag formulir, saya perlu tahu apakah itu pengguna atau JavaScript lainnya. Karena tidak ada parameter yang dapat dilewati, itu tidak mungkin secara langsung, sehingga beberapa orang menambahkan variabel untuk mengetahui apakah validasi harus dilakukan atau tidak. Hal pertama pada fungsi validasi adalah memeriksa nilai variabel itu, dll ... Terlalu rumit dan kode tidak mengatakan apa yang benar-benar diinginkan.Jadi solusinya adalah tidak memiliki onsubmit pada tag form. Insead meletakkannya di tempat yang benar-benar dibutuhkan, di tombol.
Untuk sisi lain, mengapa meletakkan kode onsubmit karena secara konsep saya tidak ingin validasi onsubmit. Saya sangat ingin validasi tombol.
Tidak hanya kode lebih jelas, itu adalah di mana harus. Hanya ingat ini: - Saya tidak ingin JavaScript memvalidasi formulir (yang harus selalu dilakukan oleh PHP di sisi server) - Saya ingin menunjukkan kepada pengguna pesan yang mengatakan semua bidang tidak boleh kosong, yang membutuhkan JavaScript (klien sisi)
Jadi mengapa sebagian orang (berpikir atau memberi tahu saya) itu harus dilakukan dengan validasi onsumbit? Tidak, secara konseptual saya tidak melakukan onsumbit memvalidasi di sisi klien. Saya hanya melakukan sesuatu pada tombol ditekan, jadi mengapa tidak membiarkan itu diterapkan?
Baik kode dan gaya melakukan trik dengan sempurna. Pada JavaScript apa pun yang saya perlukan untuk mengirim formulir yang baru saja saya masukkan:
Dan itu melompati validasi ketika saya tidak membutuhkannya. Itu hanya mengirim formulir dan memuat halaman yang berbeda, dll.
Tetapi jika pengguna mengklik tombol kirim (alias
type="button"
tidaktype="submit"
) validasi dilakukan sebelum membiarkan formulir dikirimkan dan jika tidak valid tidak dikirim.Semoga ini membantu orang lain untuk tidak mencoba kode yang panjang dan rumit. Hanya tidak digunakan
onsubmit
jika tidak diperlukan, dan gunakanonclick
. Tapi ingat untuk mengubahtype="submit"
ketype="button"
dan jangan lupa untuk melakukansubmit()
oleh JavaScript.sumber
Saya setuju dengan Shog9, meskipun saya mungkin menggunakan:
Menurut w3schools ,
<button>
tag memiliki perilaku berbeda di browser yang berbeda.sumber
Misalkan form HTML Anda sudah
id="form_id"
Tambahkan potongan jQuery ini ke kode Anda untuk melihat hasilnya,
sumber
Anda cukup mendapatkan referensi tombol Anda menggunakan jQuery, dan mencegah penyebarannya seperti di bawah ini:
sumber
e.preventDefault(); e.stopPropagation();
sudah cukup untuk bekerja.e.stopImmediatePropagation()
ini menimbulkan kesalahan pada metode yang tidak terdefinisi di Chrome.$("form").submit(function () { return false; });
yang akan mencegah tombol mengirimkan atau Anda hanya dapat mengubah jenis tombol menjadi "tombol"<input type="button"/>
daripada<input type="submit"/>
Yang hanya akan berfungsi jika tombol ini bukan satu-satunya tombol dalam formulir ini.sumber
Ini adalah kesalahan html5 seperti yang telah dikatakan, Anda masih dapat memiliki tombol sebagai kirim (jika Anda ingin mencakup pengguna javascript dan non javascript) menggunakannya seperti:
Dengan cara ini Anda akan membatalkan pengiriman tetapi masih melakukan apa pun yang Anda lakukan dalam fungsi jquery atau javascript dan melakukan pengiriman untuk pengguna yang tidak memiliki javascript.
sumber
Saya yakin bahwa pada FF
fungsi menemukan kesalahan JavaScript, ini tidak terjadi di IE
Ketika kesalahan javascript muncul, kode "return false" tidak akan berjalan, membuat halaman menjadi postback
sumber
Return salah mencegah perilaku default. tetapi return false memecah gelembung acara klik tambahan. Ini berarti jika ada binding klik lain setelah fungsi ini dipanggil, yang lain tidak mempertimbangkan.
Atau cukup Anda dapat menempatkan seperti ini
sumber
Cukup tambahkan
e.preventDefault();
metode Anda agar halaman Anda tidak mengirimkan formulir.Menurut MDN Web Documents
sumber
sumber
Anda dapat mengembalikan false di akhir fungsi atau setelah panggilan fungsi.
Selama itu adalah hal terakhir yang terjadi, formulir tidak akan dikirimkan.
sumber
Inilah pendekatan sederhana:
sumber
Kode contoh berikut menunjukkan kepada Anda bagaimana mencegah klik tombol dari mengirimkan formulir.
Anda dapat mencoba kode sampel saya:
sumber
Saya tidak dapat menguji ini sekarang, tapi saya pikir Anda bisa menggunakan metode preventDefault jQuery .
sumber
Fungsi removeItem sebenarnya mengandung kesalahan, yang membuat tombol form melakukan perilaku defaultnya (mengirimkan formulir). Konsol kesalahan javascript biasanya akan memberikan pointer dalam kasus ini.
Lihat fungsi removeItem di bagian javascript:
Garis:
tidak bekerja Coba ini sebagai gantinya:
sumber