Cegah pengalihan formulir ATAU segarkan saat mengirimkan?

96

Saya telah mencari melalui banyak halaman, tetapi tidak dapat menemukan masalah saya, jadi saya harus membuat posting.

Saya memiliki formulir yang memiliki tombol kirim, dan ketika dikirim, saya ingin TIDAK menyegarkan ATAU mengalihkan. Saya hanya ingin jQuery melakukan suatu fungsi.

Berikut formulirnya:

<form id="contactForm">
    <fieldset>
        <label for="Name">Name</label>
        <input id="contactName" type="text" />
    </fieldset>

    <fieldset>
        <label for="Email">Email</label>
        <input id="contactEmail" type="text" />
    </fieldset>

    <fieldset class="noHeight">
        <textarea id="contactMessage" cols="20"></textarea>
        <input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
    </fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>

Dan inilah jQuery:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}

Saya sudah mencoba dengan dan tanpa elemen tindakan di formulir, tapi tidak tahu apa yang saya lakukan salah. Yang lebih mengganggu saya adalah saya memiliki contoh yang melakukannya dengan sempurna: Halaman Contoh

Jika Anda ingin melihat masalah saya secara langsung, kunjungi stormink.net (situs saya) dan periksa bilah sisi yang bertuliskan "Kirim saya dan email" dan "Berlangganan RSS". Keduanya adalah formulir yang saya coba agar ini berfungsi.

Ian Storm Taylor
sumber

Jawaban:

178

Cukup tangani pengiriman formulir pada acara kirim , dan kembalikan salah:

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});

Anda tidak memerlukan lagi acara onclick di tombol kirim:

<input class="submit" type="submit" value="Send" />
Christian C. Salvadó
sumber
11
Bekerja seperti pesona! Dan secepat apapun! Saya suka situs ini! Terima kasih banyak.
Ian Storm Taylor
3
Saya ingat saat saya belajar bahwa seseorang bisa mengembalikan false dari sebuah submit ke tidak submit juga saat saya mulai sangat menyukai sistem Javascript / DOM.
Imagist
Luar biasa. Di mana saya dapat menemukan dokumen spesifikasi yang menjelaskan hal tersebut yang falsemencegah pengiriman?
davide
7
Anda harus benar-benar menggunakan e.preventDefault () alih-alih hanya mengembalikan false ..
Juan
3
@RogerFiler salah. jika Anda menggunakan "return false;" Anda juga menghentikan penyebaran, yang akan menyebabkan masalah UX. Misalnya, jika Anda mengharapkan "klik" untuk melembung atau semacamnya.
Juan
19

Sini:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});

Alih-alih menggunakan event onClick, Anda akan menggunakan bind sebuah event handler 'click' menggunakan jQuery ke tombol submit (atau tombol apa saja), yang akan mengambil submitClick sebagai callback. Kami meneruskan acara ke callback untuk memanggil preventDefault , yang akan mencegah klik mengirimkan formulir.

karim79.dll
sumber
$ ('# contactSend'). klik (submitClick (e)); Dikatakan kepada saya bahwa 'e' tidak didefinisikan ..: /
David Da Silva Lanjut
3
Harus $('#contactSend').click(function(e) { submitClick(e) });atau$('#contactSend').click(submitClick);
Aaron
14

Di tag pembuka formulir Anda, setel atribut tindakan seperti ini:

<form id="contactForm" action="#">
Brian Loughnane
sumber
2
1 untuk solusi sederhana. Namun sayangnya halaman tersebut masih akan me-refresh saat pertama kali pengguna menekan enter. Solusi buruk adalah menelepon myForm.submit();sesegera mungkin, tetapi kemudian Anda memuat halaman dua kali.
cyclingLinguist
itu tidak akan menyegarkan untuk pertama kalinya.
Nearoo
Jawaban ini perlu ditolak, karena TIDAK menyelesaikan pertanyaan awal, dan memperburuk situasi dengan benar-benar mengubah url setelah halaman dimuat ulang. Anda perlu salah satu e.preventDefault()atau di return falsedalam fungsi pengiriman. stackoverflow.com/questions/19454310/…
Jeff
10

Sepertinya Anda melewatkan file return false.

Jesse Kochis
sumber
6

Jika Anda ingin melihat kesalahan browser default ditampilkan , misalnya, yang dipicu oleh atribut HTML (muncul sebelum perlakuan JS kode klien):

<input name="o" required="required" aria-required="true" type="text">

Anda harus menggunakan submitacara tersebut, bukan clickacara tersebut. Dalam hal ini popup akan secara otomatis ditampilkan meminta " Harap isi bidang ini ". Bahkan dengan preventDefault:

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment

Seperti yang disebutkan sebelumnya , return falseakan menghentikan penyebaran (yaitu jika ada lebih banyak penangan yang dilampirkan ke pengiriman formulir, mereka tidak akan dieksekusi), tetapi, dalam kasus ini, tindakan yang dipicu oleh browser akan selalu dijalankan terlebih dahulu. Bahkan dengan a return falsedi akhir.

Jadi, jika Anda ingin menyingkirkan pop-up default ini , gunakan clickacara di tombol kirim:

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes
CPHPython
sumber
3

Solusi alternatifnya adalah dengan tidak menggunakan tag form dan menangani event klik pada tombol submit melalui jquery. Dengan cara ini tidak akan ada penyegaran halaman tetapi pada saat yang sama ada sisi negatifnya yaitu tombol "enter" untuk pengiriman tidak akan berfungsi dan juga di ponsel Anda tidak akan mendapatkan tombol buka (gaya di beberapa ponsel). Jadi tetap gunakan tag formulir dan gunakan jawaban yang diterima.

Shishir Arora
sumber