Kod JavaScript, aby zatrzymać przesyłanie formularza


205

Jednym ze sposobów zatrzymania przesyłania formularza jest zwrócenie wartości false z funkcji JavaScript.

Po kliknięciu przycisku wysyłania wywoływana jest funkcja sprawdzania poprawności. Mam przypadek walidacji formularza. Jeśli ten warunek jest spełniony, wywołuję funkcję o nazwie returnToPreviousPage ();

function returnToPreviousPage() {
    window.history.back();
}

Używam JavaScript i Dojo Toolkit .

Zamiast wracać do poprzedniej strony, przesyła formularz. Jak mogę przerwać przesyłanie i wrócić do poprzedniej strony?


RU Pewnie, że ta funkcja wywołuje ?? spróbuj wprowadzić alert („test”); przed window.history
samirprogrammer

tak jestem pewna; to się nazywa.
Muhammad Imran Tariq

Odpowiedzi:


291

Możesz użyć wartości zwracanej przez funkcję, aby zapobiec przesłaniu formularza

<form name="myForm" onsubmit="return validateMyForm();"> 

i działają jak

<script type="text/javascript">
function validateMyForm()
{
  if(check if your conditions are not satisfying)
  { 
    alert("validation failed false");
    returnToPreviousPage();
    return false;
  }

  alert("validations passed");
  return true;
}
</script>

W przypadku Chrome 27.0.1453.116 m, jeśli powyższy kod nie działa, ustaw pole returnValue parametru modułu obsługi zdarzeń na false, aby działało.

Dzięki Sam za udostępnienie informacji.

EDYTOWAĆ :

Dzięki Vikram za jego obejście, jeśli validateMyForm () zwraca false:

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

gdzie validateMyForm () to funkcja, która zwraca false, jeśli sprawdzanie poprawności się nie powiedzie. Kluczową kwestią jest użycie zdarzenia name. Nie możemy użyć dla egepreventDefault ()


1
Tylko zgadnij: nie działa dla mnie w najnowszej wersji Chrome.
Sam

5
Wszystko, co powraca false, nie wydaje się mieć żadnego wpływu; Chrome nadal przesyła formularz. Na przykład onsubmit="return false;". Jednak ustawienie obsługi zdarzeń za parametru returnValueboiska i falsedziała dla mnie.
Sam

3
Cześć Sam / Hemant, czy możesz podać próbkę kodu, jak ustawić wartość parametru returnValue parametru obsługi zdarzenia na false.
JackDev,

2
Myślę, że skoro jest to zaakceptowana odpowiedź, prawdopodobnie powinna powiedzieć, jak zrobić to poprawnie. Wraz z JackDevem zastanawiam się, jak to zrobić, aby działało poprawnie. Jak to nie działa
Cruncher

1
Jeśli validateMyForm()ma błędy return falsenie zostaną osiągnięte. Więc to może się nie powieść. Po wielu godzinach znalazłem rozwiązanie, które działa i opublikowałem je poniżej.
Vikram Pudi

116

Użyj opcji zapobiegania domyślnym

Zestaw narzędzi Dojo

dojo.connect(form, "onsubmit", function(evt) {
    evt.preventDefault();
    window.history.back();
});

jQuery

$('#form').submit(function (evt) {
    evt.preventDefault();
    window.history.back();
});

Waniliowy JavaScript

if (element.addEventListener) {
    element.addEventListener("submit", function(evt) {
        evt.preventDefault();
        window.history.back();
    }, true);
}
else {
    element.attachEvent('onsubmit', function(evt){
        evt.preventDefault();
        window.history.back();
    });
}

3
Polecam event.preventDefault () nad return false dla wielu powodów, powinno to być górna odpowiedź: blog.nmsdvid.com/...
acidjazz

1
Dobra odpowiedź. Lepszy niż wybrany.
Ani Menon,

2
Dobrze, ale gdzie przeprowadziłbyś weryfikację, jakiej chce OP?
Sahand

1
@acidjazz Ale jak można uzyskać dostęp do danych formularza po zapobieganiu domyślnemu?
CodeAt30

@Sahand @ codeat30 Możesz uzyskać dostęp do wydarzenia target.
Adrien

49

Obecnie działa (testowany w Chrome i Firefox):

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

Gdzie validateMyForm () to funkcja zwracana w falseprzypadku niepowodzenia sprawdzania poprawności. Kluczową kwestią jest użycie nazwy event. Nie możemy używać do np e.preventDefault().


15

Wystarczy użyć prostego buttonzamiast przycisku przesyłania. I wywołaj funkcję JavaScript do obsługi przesyłania formularza:

<input type="button" name="submit" value="submit" onclick="submit_form();"/>

Funkcja w scripttagu:

function submit_form() {
    if (conditions) {
        document.forms['myform'].submit();
    }
    else {
        returnToPreviousPage();
    }
}

Możesz także spróbować window.history.forward(-1);


Podoba mi się to podejście, ponieważ pozwala ono na mój przypadek użycia, wywołania zwrotne.
Eddie

12
Zapobiega to użyciu klawisza Enter do przesłania formularza. Ponadto nowe atrybuty HTML5, takie jak required, nie będą działać.
Sam

8

Wiele trudnych sposobów na łatwą rzecz:

<form name="foo" onsubmit="return false">

3
Ta dokładna odpowiedź (OK, nie do końca, ponieważ w twoim brakuje dwukropka) została przesłana 8 miesięcy wcześniej i ma uzasadnione głosy negatywne. Działa to przez większość czasu. Ale nie we wszystkich przeglądarkach przez cały czas.
Auspex

3
Nie powiedziałem, że potrzebujesz średnika; Zwróciłem uwagę, że to wszystko różniło się od twojej odpowiedzi i znacznie starszej. Fakt, że teraz prosisz mnie o wskazanie, które przeglądarki go nie obsługują (nigdy nie powiedziałem, że takie istnieją, wskazałem tylko, że nie zawsze będzie działać), dowodzi, że nadal nie przeczytałeś całej strony .
Auspex

2
Zwykle nie badam głosów negatywnych, z wyjątkiem tego, że nie wiedziałem, że ludzie głosowali w dół poprawny kod. Technicznie rzecz biorąc, średnik jest obcy, więc się myli. Powiedziałeś, że „w twoim brakuje średnika”, co oznacza, że ​​jest potrzebny, co jest złe. Mówisz, że „nie zawsze będzie działać”, ale nie możesz wskazać jednego przypadku lub przeglądarki, w której nie będzie działać? To jest logika dźwięku? To poprawny kod. Więc jeśli nie potrafisz wskazać przypadku, w którym to nie zadziała, nie masz w ogóle sensu.
Danial

Jak to nie ma więcej głosów pozytywnych? Jest znacznie bardziej zwięzły w porównaniu do innych przykładów.
Sal Alturaigi

Prawdopodobnie dlatego, że tytuł nie pasuje do tego, o co pytał facet.
Danial

6

Wszystkie twoje odpowiedzi dały coś do pracy.

WRESZCIE, to zadziałało dla mnie: (jeśli nie wybierzesz przynajmniej jednego pola wyboru, to ostrzega i pozostaje na tej samej stronie)

<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <form name="helloForm" action="HelloWorld" method="GET"  onsubmit="valthisform();">
            <br>
            <br><b> MY LIKES </b>
            <br>
            First Name: <input type="text" name="first_name" required>
            <br />
            Last Name: <input type="text" name="last_name"  required />
            <br>
            <input type="radio" name="modifyValues" value="uppercase" required="required">Convert to uppercase <br>
            <input type="radio" name="modifyValues" value="lowercase" required="required">Convert to lowercase <br>
            <input type="radio" name="modifyValues" value="asis"      required="required" checked="checked">Do not convert <br>
            <br>
            <input type="checkbox" name="c1" value="maths"     /> Maths
            <input type="checkbox" name="c1" value="physics"   /> Physics
            <input type="checkbox" name="c1" value="chemistry" /> Chemistry
            <br>

            <button onclick="submit">Submit</button>

            <!-- input type="submit" value="submit" / -->
            <script>
                <!---
                function valthisform() {
                    var checkboxs=document.getElementsByName("c1");
                    var okay=false;
                    for(var i=0,l=checkboxs.length;i<l;i++) {
                        if(checkboxs[i].checked) {
                            okay=true;
                            break;
                        }
                    }
                    if (!okay) { 
                        alert("Please check a checkbox");
                        event.preventDefault();
                    } else {
                    }
                }
                -->
            </script>
        </form>
    </body>
</html>

Pracował również dla mnie.
chetan

4

Bazując na odpowiedzi @Vikram Pudi, możemy to zrobić również z czystym Javascriptem

<form onsubmit="submitForm(event)">
    <input type="text">
    <input type="submit">
</form>

<script type="text/javascript">

    function submitForm(event){
        event.preventDefault();


    }
</script>

3

Zalecałbym nie używać onsubmiti zamiast tego dołączać zdarzenia w skrypcie.

var submit = document.getElementById("submitButtonId");
if (submit.addEventListener) {
  submit.addEventListener("click", returnToPreviousPage);
} else {
  submit.attachEvent("onclick", returnToPreviousPage);
}

Następnie użyj preventDefault()(lub w returnValue = falseprzypadku starszych przeglądarek).

function returnToPreviousPage (e) {
  e = e || window.event;
  // validation code

  // if invalid
  if (e.preventDefault) {
    e.preventDefault();
  } else {
    e.returnValue = false;
  }
}

Czy możesz wyjaśnić, dlaczego nie używałbyś onsubmit?
theFreedomBanana

Może to tylko preferencja, ale łatwiej mi zrozumieć funkcjonalność strony internetowej, jeśli wszystkie detektory zdarzeń są dołączone za pomocą JSzamiast HTMLatrybutów. W ten sposób nie musisz tyle przeskakiwać w przód i w tył podczas czytania cudzego kodu
Isaac Abramowitz

co jeśli ktoś naciśnie klawisz Enter na jednym z wejść zamiast klikać przycisk? ogólnie ii nadal przedstawia ...
bluejayke

1

Powiedzmy, że masz podobny formularz

<form action="membersDeleteAllData.html" method="post">
    <button type="submit" id="btnLoad" onclick="confirmAction(event);">ERASE ALL DATA</button>
</form>

Oto javascript dla funkcji confirmAction

<script type="text/javascript">
    function confirmAction(e)
    {
        var confirmation = confirm("Are you sure about this ?") ;

        if (!confirmation)
        {
            e.preventDefault() ;
            returnToPreviousPage();
        }

        return confirmation ;
    }
</script>

Ten działa w przeglądarce Firefox, Chrome, Internet Explorer (Edge), Safari itp.

Jeśli tak nie jest, daj mi znać


1
Połączenie preventDefault()i returnToPreviousPage()jest idealne i eleganckie. Przerywa normalne działanie, tak jakbyś zaprojektował dowolny łapacz wyjątków do pracy. +1.
1934286

1

Odpowiedzi Hemanta i Vikrama nie działały dla mnie wprost w Chrome. Event.preventDefault (); skrypt uniemożliwił przesłanie strony bez względu na to, czy sprawdzanie poprawności zakończyło się pomyślnie. Zamiast tego musiałem przenieść event.preventDefault (); do instrukcji if w następujący sposób:

    if(check if your conditions are not satisfying) 
    { 
    event.preventDefault();
    alert("validation failed false");
    returnToPreviousPage();
    return false;
    }
    alert("validations passed");
    return true;
    }

Dzięki Hemantowi i Vikramowi za postawienie mnie na właściwej drodze.


Pracowałem też dla mnie. Dzięki.
ivbtar

1

Np. Jeśli masz przycisk w formularzu, aby zatrzymać jego propagację, po prostu napisz event.preventDefault (); w funkcji wywoływanej po kliknięciu przycisku Prześlij lub Enter.


0

Po prostu zrób to ....

<form>
<!-- Your Input Elements -->
</form>

i oto twoja JQuery

$(document).on('submit', 'form', function(e){
    e.preventDefault();
    //your code goes here
    //100% works
    return;
});

1
używałeś jquery tutaj?
Selva Ganapathi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.