Jak zapobiec wysyłaniu formularzy?

Mam formularz, który ma gdzieś przycisk submit.

Chciałbym jednak jakoś "złapać" Zdarzenie submit i zapobiec jego wystąpieniu.

Czy Mogę to jakoś zrobić?

Nie mogę zmodyfikować przycisku submit, ponieważ jest to część niestandardowej kontroli.

Author: marco-fiset, 2010-07-28

7 answers

W przeciwieństwie do innych odpowiedzi, return false jest tylko częścią odpowiedzi. Rozważmy scenariusz, w którym błąd JS występuje przed instrukcją return...

Html

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

Skrypt

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

Zwrócenie false tutaj nie zostanie wykonane, a Formularz zostanie przesłany w obie strony. Należy również wywołać preventDefault, aby zapobiec domyślnej akcji formularza dla przesyłania formularzy Ajax.

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

W tym przypadku, nawet z błędem formularz Nie poddaj się!

Alternatywnie można użyć bloku try...catch.

function mySubmit(evt) { 
  evt.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
 176
Author: Ben Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-11 23:23:49

Możesz użyć zdarzenia inline onsubmit w ten sposób

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

Lub

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

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

Demo

To może nie być dobry pomysł przy dużych projektach. Może być konieczne użycie słuchaczy zdarzeń.

Proszę przeczytaj więcej o Inline Events vs Event Listener (Addeventlistener i attachEvent IE) tutaj . Nie potrafię tego wyjaśnić bardziej niż Chris Baker.

Oba są poprawne, ale żaden z nich nie jest "najlepszy" per se, i nie może be powód, dla którego deweloper wybrał oba podejścia.

 125
Author: Reigel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 15:45:45

Dołącz detektor zdarzeń do formularza za pomocą .addEventListener() a potem zadzwoń do .preventDefault() metoda na 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>

Myślę, że jest to lepsze rozwiązanie niż zdefiniowanie obsługi zdarzeń submit inline z atrybutem onsubmit, ponieważ oddziela ona logikę i strukturę strony. O wiele łatwiej jest utrzymać projekt, w którym logika jest oddzielona od HTML. Zobacz: Dyskretny JavaScript .

Użycie właściwości .onsubmit obiektu form DOM jest nie jest to dobry pomysł, ponieważ uniemożliwia dołączanie wielu wywołań zwrotnych do jednego elementu. Zobacz addEventListener vs onclick .

 81
Author: Michał Perłakowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 10:05:12

Spróbuj tego...

Kod HTML

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

Kod JQuery

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

Lub

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
 10
Author: Sach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 07:36:16

Poniższe działa od teraz (testowane w chrome i firefox):

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

Gdzie validateMyForm () jest funkcją, która zwraca false jeśli Walidacja nie powiedzie się. Kluczową kwestią jest użycie nazwy event. Nie możemy użyć np. e.preventDefault()

 7
Author: Vikram Pudi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-14 06:48:06
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}
 6
Author: naikus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 05:57:27

Aby postępować zgodnie z dyskretnymi konwencjami programowania JavaScript i w zależności od tego, jak szybko załaduje się DOM , dobrym pomysłem może być użycie:

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

Następnie połącz zdarzenia za pomocą onload lub DOM ready, jeśli używasz biblioteki.

$(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>

Również zawsze używałbym atrybutu action, ponieważ niektórzy ludzie mogą mieć uruchomiony plugin NoScript, który następnie złamałby walidację. Jeśli używasz atrybut action, przynajmniej twój użytkownik zostanie przekierowany przez serwer na podstawie walidacji zaplecza. Jeśli używasz czegoś takiego jak window.location, z drugiej strony, rzeczy będą złe.

 -1
Author: Sebastian Palma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-13 02:27:27