zapobiega odświeżaniu strony po kliknięciu przycisku wewnątrz formularza


148

Mam problem podczas używania przycisków w formularzu. Chcę, żeby ten przycisk wywoływał funkcję. Tak, ale z niepożądanym skutkiem odświeża stronę.

Mój prosty kod wygląda tak

<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

Po kliknięciu przycisku funkcja zostaje wywołana z odświeżeniem strony, co powoduje zresetowanie wszystkich moich poprzednich żądań, które mają wpływ na bieżącą stronę, będącą wynikiem poprzedniego żądania.

Co powinienem zrobić, aby zapobiec odświeżeniu strony?


musisz określić parametry, jeśli po prostu używasz window.location = window.location.href; odświeży całą stronę i zresetuje wszystkie poprzednie żądania. sprawdź to: stackoverflow.com/questions/133925/…
linguini


@bunkdeath: słaba odpowiedź powinna zostać zaakceptowana.
Jad Chahine,

@JadChahine przepraszam, nie zdawałem sobie sprawy, że nie zaakceptowałem odpowiedzi, dziękuję za wskazanie tego. Byłem początkującym i nie wiedziałem, co robię, a czego nie. Ale nie przyjmuję odpowiedzi, o której wspomniałaś, raczej zaakceptuję tę, która mi wtedy pomogła :)
bunkdeath

Odpowiedzi:


67

Niech getData()zwróci fałsz. To naprawi to.

<form method="POST">
    <button name="data" onclick="return getData()">Click</button>
</form>

1
W rzeczy samej. onclickFunkcja musi zwrócić fałszywe, nie getData.
Quentin,

1
To właśnie mam na myśli, ale w porządku, zmodyfikowałem odpowiedź, aby była bardziej przejrzysta.
JNDPNT

5
nie musisz zmieniać funkcji - możesz po prostu użyć onclick = "getData (); return false;"

2
type="button"jest naprawdę haczykiem.
deepcell

338

Dodaj type="button"do przycisku.

<button name="data" type="button" onclick="getData()">Click</button>

Domyślna wartość typeprzycisku to submit, która samodzielnie publikuje formularz w Twoim przypadku i sprawia, że ​​wygląda jak odświeżenie.


8
Doskonała odpowiedź podana tutaj
timberlake

2
Z wyjątkiem tego, że zapobiega to sprawdzaniu poprawności formularza HTML5 (np. Przy wprowadzaniu typu = "email").
2540625

2
Możesz również dodać return false;do onclick:onclick="getData(); return false;"
JBaczuk

1
To najlepsza opcja. Chociaż "return false" może działać w tekście, nie ma takiej opcji, o której wiem, kiedy dodajemy detektory zdarzeń. Określenie type = "button" naprawdę oszczędza dzień.
Forever Noob

1
To jest właściwie „oficjalne” rozwiązanie tego rodzaju problemu. Zwracanie false MIGHT również działa, ale przycisk typu nigdy nie zawiedzie.
student0495

18

Wszystko, co musisz zrobić, to umieścić znacznik typu i zrobić przycisk typu.

<button id="btnId" type="button">Hide/Show</button>

To rozwiązuje problem


2
Czy możesz to rozwinąć i wyjaśnić, dlaczego?
mjk

Domyślne zachowanie przycisku jest typu wysyłania wewnątrz formularza, po zmianie go na typ przycisku można uniknąć postu
Ganesh Kodiganti

16

Problem w tym, że uruchamia przesłanie formularza. Jeśli wykonasz tę getDatafunkcję return false, powinna ona zatrzymać przesyłanie formularza.

Alternatywnie możesz również użyć preventDefaultmetody obiektu zdarzenia:

function getData(e) {
    e.preventDefault();
}

Zdarzenie kliknięcia, które zostanie przekazane.
JNDPNT

Tyle, że (bez dalszych modyfikacji) obiekt zdarzenia nie zostanie przekazany.
Quentin,

<button name = "data" onclick = "getData ($ event)"> Kliknij </button>
RoboMex

9

HTML

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

jQuery

$('#myForm').submit(function() {
    doSomething();
});

$ ('. myForm) powinno być $ (' # myForm)
Mutant

3
<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

zamiast tagu przycisku, użyj tagu wejściowego. Lubię to,

<form method="POST">
    <input type = "button" name="data" onclick="getData()" value="Click">
</form>

ale to nie utworzyło przycisku odbutton type='button'
Pardeep Jain

3

Jeśli twój przycisk jest domyślnym „przyciskiem”, upewnij się, że wyraźnie ustawiłeś atrybut type, w przeciwnym razie WebForm potraktuje go jako domyślny.

jeśli używasz js, zrób to w ten sposób

<form method="POST">
   <button name="data"  type="button" id="btnData" onclick="getData()">Click</button>
</form> 

**If you use jquery use like this**


<form method="POST">
   <button name="data"  type="button" id="btnData">Click</button>
</form>




$('#btnData').click(function(e){
   e.preventDefault();
   // Code goes here
getData(); // your onclick function call here

});

2

Metoda javascript służąca do wyłączania samego przycisku

document.getElementById("ID NAME").disabled = true;

Gdy wszystkie pola formularza spełnią Twoje kryteria, możesz ponownie włączyć przycisk

Używanie Jquery będzie wyglądać mniej więcej tak

$( "#ID NAME" ).prop( "disabled", true);

0

Z jakiegokolwiek powodu w Firefoksie, mimo że mam return false;i myform.preventDefault();w funkcji, odświeża stronę po uruchomieniu funkcji. I nie wiem, czy to dobra praktyka, ale u mnie działa, wstawiam javascript:this.preventDefault();atrybut działania.

Jak powiedziałem, próbowałem wszystkie inne sugestie i one działać poprawnie we wszystkich przeglądarkach, ale Firefox, jeśli masz ten sam problem, spróbuj dodanie zapobiec zdarzenie w atrybucie akcji albo javascript:return false;albo javascript:this.preventDefault();. Nie próbuj zjavascript:void(0); który złamie twój kod. Nie pytaj mnie dlaczego :-).

Nie sądzę, żeby to był elegancki sposób, ale w moim przypadku nie miałem innego wyjścia.

Aktualizacja:

Jeśli otrzymałeś błąd ... po przetworzeniu Ajax, usuń akcję atrybutu iw onsubmitatrybucie wykonaj swoją funkcję, po której nastąpi fałszywy zwrot:

onsubmit="functionToRun(); return false;"

Nie wiem, dlaczego tak się dzieje z Firefoksem, ale mam nadzieję, że to zadziała.


0

Funkcja Return nie działa we wszystkich przypadkach. Próbowałem tego:

<button id="Reset" class="Button-class" onclick="return Reset()">Show result</button>

To mi nie pomogło.

Próbowałem zwrócić false wewnątrz funkcji i zadziałało.

function Reset()
{
    .
    .
    .
    return false;
}

0

Miałem ten sam problem. Problem dotyczy onclickfunkcji. Nie powinno być żadnych problemów z funkcją getData. Zadziałało, powodując, że onclickfunkcja zwróciła fałsz.

<form method="POST">
    <button name="data" onclick="getData(); return false">Click</button>
</form>

0

To jest najlepsze rozwiązanie:

<form  method="post"> 
    <button  type="button" name="data" onclick="getData()">Click Me</button>
</form>

Uwaga: mój kod jest bardzo prosty.


-2

Możesz użyć Ajax i jquery, aby rozwiązać ten problem:

<script>
    function getData() {
        $.ajax({
            url : "/urlpattern",
            type : "post",
            success : function(data) {
                alert("success");
            } 
        });
    }
</script>
<form method="POST">
    <button name="data" type="button" onclick="getData()">Click</button>
</form>

Ta odpowiedź jest zbyt skomplikowana, nie mówiąc już o konieczności zewnętrznej biblioteki, aby zapobiec problemowi PO, gdy można zastosować inne, prostsze metody.
Zac
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.