Bagaimana cara mencegah pengiriman formulir?

244

Saya memiliki formulir yang memiliki tombol kirim di suatu tempat.

Namun, saya ingin 'menangkap' acara pengiriman dan mencegahnya agar tidak terjadi.

Apakah ada cara saya bisa melakukan ini?

Saya tidak dapat mengubah tombol kirim, karena itu bagian dari kontrol khusus.

Nathan Osman
sumber
Anda masih dapat mengakses tombol kirim. Render halaman dan ambil ClientID-nya dengan melihat sumber halaman. Kemudian, menggunakan sesuatu seperti jQuery, Anda dapat melakukan sesuatu seperti $ ('# ctl01_cph01_controlBtn1'). Klik (function () {return false;});
pemberontak
@ Rafael: Benar ... tapi itu akan menjadi pilihan terakhir - ini adalah kontrol yang sangat kompleks.
Nathan Osman
@ Raf yang berbasis asp.net, dan juga bukan praktik terbaik. Tetapi pada dasarnya itu benar. Saya hanya menghindari mengintip sumbernya dan menggunakan nama kontrol, karena dapat berubah jika seseorang mengedit halaman. Efek samping yang tidak diinginkan dan semacamnya.

Jawaban:

261

Berbeda dengan jawaban yang lain, pengembalian falsehanyalah sebagian dari jawaban. Pertimbangkan skenario di mana kesalahan JS terjadi sebelum pernyataan pengembalian ...

html

<form onsubmit="return mySubmitFunction(event)">
  ...
</form>

naskah

function mySubmitFunction()
{
  someBug()
  return false;
}

kembali ke falsesini tidak akan dieksekusi dan formulir akan dikirimkan dengan cara apa pun. Anda juga harus menelepon preventDefaultuntuk mencegah tindakan formulir default untuk pengiriman formulir Ajax.

function mySubmitFunction(e) {
  e.preventDefault();
  someBug();
  return false;
}

Dalam hal ini, bahkan dengan bug, formulir tidak akan dikirimkan!

Atau, try...catchblok dapat digunakan.

function mySubmit(e) { 
  e.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
Ben Rowe
sumber
4
Mengapa tidak falselangsung kembali dari onsumbit?
ProfK
1
Anda mungkin ingin menampilkan pesan kesalahan kepada pengguna di onsubmit. Contoh sebelumnya, "isi bidang wajib ini, lalu kirim". Dalam hal ini event.preventDefault akan sangat berguna
Mark Chorley
1
@ProfK jika Anda menggunakan event.preventDefault () tidak masalah, coba / tangkap hanya akan menjadi bagian dari penanganan kesalahan Anda
Ben Rowe
11
<form onsubmit = "return mySubmitFunction (event)"> berfungsi ... harus menggunakan kata event dalam tanda kurung di firefox
danday74
5
@ BenRowe Anda harus menambahkan parameter evt ke metode yang dipanggil. (<form onsubmit="return mySubmitFunction(evt)">).Otherwise itu memberikan kesalahan Undefined.
UfukSURMEN
143

Anda dapat menggunakan acara inline onsubmitseperti ini

<form onsubmit="alert('stop submit'); return false;" >

Atau

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

Demo

Sekarang, ini mungkin bukan ide yang baik ketika membuat proyek besar. Anda mungkin perlu menggunakan Pendengar Acara.

Silakan baca lebih lanjut tentang Acara Inline vs Pendengar Acara (addEventListener dan IE's attachEvent) di sini . Sebab aku tidak bisa menjelaskannya lebih daripada yang dilakukan Chris Baker .

Keduanya benar, tetapi tidak ada yang "terbaik" per se, dan mungkin ada alasan pengembang memilih untuk menggunakan kedua pendekatan tersebut.

Reigel
sumber
Bagus, solusi cepat di jalan.
Fernando Torres
untuk beberapa alasan, <form onsubmit="return false;" >tidak berfungsi untuk saya.
Ruan
102

Lampirkan pendengar acara ke formulir menggunakan .addEventListener()dan kemudian memanggil .preventDefault()metode di event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

Saya pikir ini solusi yang lebih baik daripada mendefinisikan submit event handler sesuai dengan onsubmitatribut karena memisahkan logika dan struktur halaman web. Jauh lebih mudah untuk mempertahankan proyek di mana logika dipisahkan dari HTML. Lihat: JavaScript yang tidak mengganggu .

Menggunakan .onsubmitproperti formobjek DOM bukan ide yang baik karena mencegah Anda melampirkan beberapa panggilan balik kirim ke satu elemen. Lihat addEventListener vs onclick .

Michał Perłakowski
sumber
1
& untuk jquery: $("button").click(function(e) { e.preventDefault() });
Nixen85
2
+1 tidak tahu mengapa semua jawaban lainnya tetap menggunakan inline onsubmits, karena OP menyebutkan dia tidak dapat mengubah tombol (yang berarti dia mungkin tidak dapat mengubah formulir juga). Ingin tahu apakah ada cara untuk mendapatkan 'formulir' jika kita memiliki tombol id
Robert Sinclair
16

Coba yang ini...

Kode HTML

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

Kode jQuery

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

atau

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
Sach
sumber
18
Tidak ada tag jQuery dalam pertanyaan ini.
Michał Perłakowski
6
@ Gotdo namun solusinya masih sama. benar gila?
Kevin B
7
@ Harus ya, itu persis sama. eventObject.preventDefault. Cara Anda mengikat pawang tidak mengubah solusi. Saya bahkan berpendapat jawaban Anda tidak berbeda dengan yang diterima.
Kevin B
stopPropagationadalah satu-satunya hal yang berhasil dalam kasus saya. Terima kasih! :)
cregox
13

Yang berikut berfungsi sampai sekarang (diuji dalam chrome dan firefox):

<form onsubmit="event.preventDefault(); return validateMyForm();">

di mana validateMyForm () adalah fungsi yang mengembalikan falsejika validasi gagal. Poin kuncinya adalah menggunakan nama event. Kami tidak dapat menggunakan untuk misalnyae.preventDefault()

Vikram Pudi
sumber
1
onsubmit = "return validateMyForm ();" sudah cukup tetapi validateMyForm () harus mengembalikan true atau false.
Adrian P.
8
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}
naikus
sumber
2
Saya pikir menggunakan .onsubmitadalah ide yang buruk karena mencegah Anda melampirkan beberapa submitpanggilan balik ke satu elemen. Saya sarankan menggunakan .addEventListener().
Michał Perłakowski
3
Bahkan jika Anda telah menyetel pengendali event melalui properti .onsmitmit, Anda masih bisa menambahkan penangan tambahan melalui .addEventListener (). Handler yang terdaftar oleh properti akan dipanggil terlebih dahulu kemudian yang terdaftar dengan .addEventListener () sesuai urutan pendaftarannya.
Daniel Granger
2

Untuk mengikuti konvensi pemrograman JavaScript yang tidak mengganggu , dan tergantung pada seberapa cepat DOM akan dimuat, mungkin ide yang baik untuk menggunakan yang berikut ini:

<form onsubmit="return false;"></form>

Kemudian, sambungkan acara menggunakan onload atau DOM siap jika Anda menggunakan perpustakaan.

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

Juga, saya akan selalu menggunakan actionatribut tersebut karena beberapa orang mungkin memiliki beberapa plugin seperti NoScript berjalan yang kemudian akan memecah validasi. Jika Anda menggunakan atribut tindakan, setidaknya pengguna Anda akan diarahkan oleh server berdasarkan validasi backend. Jika Anda menggunakan sesuatu seperti window.location, di sisi lain, semuanya akan menjadi buruk.

Sebastian Palma
sumber
2

Untuk mencegah pengiriman formulir, Anda hanya perlu melakukan ini.

<form onsubmit="event.preventDefault()">
    .....
</form>

Dengan menggunakan kode di atas ini akan mencegah pengiriman formulir Anda.

Zuhair Taha
sumber
0

Inilah jawaban saya:

<form onsubmit="event.preventDefault();searchOrder(event);">
...
</form>
<script>
const searchOrder = e => {
    e.preventDefault();
    const name = e.target.name.value;
    renderSearching();

    return false;
}
</script>

Saya menambahkan event.preventDefault();pada onsubmitdan bekerja.

yozawiratama
sumber
0

Anda bisa menambahkan eventListner ke formulir, itu preventDefault()dan mengonversi data formulir ke JSON seperti di bawah ini:

const formToJSON = elements => [].reduce.call(elements, (data, element) => {
  data[element.name] = element.value;
  return data;

}, {});

const handleFormSubmit = event => {
    event.preventDefault();
    const data = formToJSON(form.elements);
    console.log(data);
  //  const odata = JSON.stringify(data, null, "  ");
  const jdata = JSON.stringify(data);
    console.log(jdata);

    (async () => {
      const rawResponse = await fetch('/', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: jdata
      });
      const content = await rawResponse.json();

      console.log(content);
    })();
};

const form = document.forms['myForm']; 
form.addEventListener('submit', handleFormSubmit);
<form id="myForm" action="/" method="post" accept-charset="utf-8">
    <label>Checkbox:
        <input type="checkbox" name="checkbox" value="on">
    </label><br /><br />

    <label>Number:
        <input name="number" type="number" value="123" />
    </label><br /><br />

    <label>Password:
        <input name="password" type="password" />
    </label>
    <br /><br />

    <label for="radio">Type:
        <label for="a">A
            <input type="radio" name="radio" id="a" value="a" />
        </label>
        <label for="b">B
            <input type="radio" name="radio" id="b" value="b" checked />
        </label>
        <label for="c">C
            <input type="radio" name="radio" id="c" value="c" />
        </label>
    </label>
    <br /><br />

    <label>Textarea:
        <textarea name="text_area" rows="10" cols="50">Write something here.</textarea>
    </label>
    <br /><br />

    <label>Select:
        <select name="select">
            <option value="a">Value A</option>
            <option value="b" selected>Value B</option>
            <option value="c">Value C</option>
        </select>
    </label>
    <br /><br />

    <label>Submit:
        <input type="submit" value="Login">
    </label>
    <br /><br />


</form>

Hasan A Yousef
sumber