Na następnej stronie w przeglądarce Firefox przycisk usuwania przesyła formularz, ale przycisk dodawania nie. Jak zapobiec przesyłaniu formularza przez przycisk usuwania?
<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
function addItem() {
var v = $('form :hidden:last').attr('name');
var n = /(.*)input/.exec(v);
var newPrefix;
if (n[1].length == 0) {
newPrefix = '1';
} else {
newPrefix = parseInt(n[1]) + 1;
}
var oldElem = $('form tr:last');
var newElem = oldElem.clone(true);
var lastHidden = $('form :hidden:last');
lastHidden.val(newPrefix);
var pat = '=\"' + n[1] + 'input';
newElem.html(newElem.html().replace(new RegExp(pat, 'g'), '=\"' + newPrefix + 'input'));
newElem.appendTo('table');
$('form :hidden:last').val('');
}
function removeItem() {
var rows = $('form tr');
if (rows.length > 2) {
rows[rows.length - 1].html('');
$('form :hidden:last').val('');
} else {
alert('Cannot remove any more rows');
}
}
</script>
</head>
<body>
<form autocomplete="off" method="post" action="">
<p>Title:<input type="text" /></p>
<button onclick="addItem(); return false;">Add Item</button>
<button onclick="removeItem(); return false;">Remove Last Item</button>
<table>
<th>Name</th>
<tr>
<td><input type="text" id="input1" name="input1" /></td>
<td><input type="hidden" id="input2" name="input2" /></td>
</tr>
</table>
<input id="submit" type="submit" name="submit" value="Submit">
</form>
</body>
</html>
Odpowiedzi:
Używasz elementu przycisku HTML5. Pamiętaj, że ten przycisk ma domyślne zachowanie przesyłania, zgodnie ze specyfikacją W3, jak widać tutaj: W3C HTML5 Button
Musisz więc wyraźnie określić jego typ:
w celu zastąpienia domyślnego typu przesyłania. Chcę tylko wskazać powód, dla którego tak się dzieje =)
=)
źródło
Ustaw typ na przyciskach:
... to powstrzyma je przed wywołaniem akcji przesyłania, gdy wystąpi wyjątek w procedurze obsługi zdarzeń. Następnie napraw swoją
removeItem()
funkcję, aby nie wyzwalała wyjątku:Zwróć uwagę na zmianę: twój oryginalny kod wyodrębnił element HTML z zestawu jQuery, a następnie próbował wywołać na nim metodę jQuery - zgłosił to wyjątek, co spowodowało domyślne zachowanie przycisku.
FWIW, istnieje inny sposób, w jaki możesz to zrobić ... Połącz swoje procedury obsługi zdarzeń za pomocą jQuery i użyj metody preventDefault () na obiekcie zdarzenia jQuery, aby anulować domyślne zachowanie z góry:
Ta technika utrzymuje całą logikę w jednym miejscu, ułatwiając debugowanie ... pozwala także na wdrożenie wycofania przez zmianę
type
przycisków na powrótsubmit
i obsługę zdarzenia po stronie serwera - jest to znane jako dyskretne JavaScript .źródło
return false
jest bardzo ważne. czasami nawet użyć go do przycisku przesyłania (onclick
)Jakiś czas temu potrzebowałem czegoś bardzo podobnego ... i dostałem to.
Wstawiam więc sposób, w jaki wykonuję sztuczki, aby formularz mógł zostać przesłany przez JavaScript bez sprawdzania poprawności i sprawdzania poprawności tylko wtedy, gdy użytkownik naciśnie przycisk (zwykle przycisk wysyłania).
Na przykład użyję minimalnego formularza, tylko z dwoma polami i przyciskiem wysyłania.
Pamiętaj, co jest potrzebne: z JavaScript musi być możliwe przesłanie go bez sprawdzania. Jeśli jednak użytkownik naciśnie taki przycisk, weryfikacja musi zostać wykonana, a formularz wysłany tylko po pozytywnym przejściu weryfikacji.
Normalnie wszystko zaczynałoby się od czegoś w pobliżu (usunąłem wszystkie dodatkowe rzeczy, które nie są ważne):
Zobacz, jak tag formularza nie ma
onsubmit="..."
(pamiętaj, że warunkiem było nie mieć go).Problem polega na tym, że formularz jest zawsze przesyłany, bez względu na to, czy
onclick
zwrottrue
lubfalse
.Jeśli zmienię
type="submit"
dlatype="button"
wydaje się działać, ale nie. Nigdy nie wysyła formularza, ale można to łatwo zrobić.Więc w końcu użyłem tego:
I
function Validator
tam, gdziereturn True;
jest, dodaję także zdanie przesyłania JavaScript, coś podobnego do tego:Dotyczy
id=""
tylko JavaScriptgetElementById
,name=""
tylko po to, aby pojawił się na danych POST.W ten sposób działa tak, jak potrzebuję.
Umieszczam to tylko dla osób, które nie potrzebują żadnej
onsubmit
funkcji w formularzu, ale dokonuję pewnej weryfikacji po naciśnięciu przycisku przez użytkownika.Dlaczego nie potrzebuję onsubmit na znaczniku formularza? Łatwo, w innych częściach JavaScript muszę wykonać przesłanie, ale nie chcę, aby była jakakolwiek weryfikacja.
Powód: jeśli użytkownik jest tym, który wykonuje przesyłanie, chcę i chcę przeprowadzić weryfikację, ale jeśli jest to JavaScript, czasami muszę wykonać przesyłanie, podczas gdy takie weryfikacje by tego uniknąć.
Może to zabrzmieć dziwnie, ale nie podczas myślenia na przykład: przy logowaniu ... z pewnymi ograniczeniami ... np. Nie zezwalaj na używanie sesji PHP i żadne ciasteczka nie są dozwolone!
Tak więc każdy link musi zostać przekonwertowany na taki formularz, aby dane logowania nie zostały utracone. Jeśli logowanie nie jest jeszcze wykonane, musi również działać. Dlatego nie można przeprowadzać sprawdzania poprawności linków. Ale chcę przedstawić użytkownikowi wiadomość, jeśli użytkownik nie wprowadził obu pól, użytkownika i hasła. Jeśli więc brakuje jednego, formularza nie można wysłać! jest problem.
Zobacz problem: formularza nie można wysłać, gdy jedno pole jest puste, tylko jeśli użytkownik nacisnął przycisk, jeśli jest to kod JavaScript, musi być możliwe wysłanie.
Jeśli będę pracować nad
onsubmit
znacznikiem formularza, będę musiał wiedzieć, czy to użytkownik, czy inny JavaScript. Ponieważ nie można przekazać żadnych parametrów, nie jest to możliwe bezpośrednio, więc niektóre osoby dodają zmienną, aby powiedzieć, czy należy przeprowadzić weryfikację, czy nie. Pierwszą rzeczą w funkcji sprawdzania poprawności jest sprawdzenie tej wartości zmiennej itp. Zbyt skomplikowane i kod nie mówi, co jest naprawdę potrzebne.Tak więc rozwiązaniem nie jest onsubmit na znaczniku formularza. Insead umieść go tam, gdzie jest naprawdę potrzebny, na przycisku.
Z drugiej strony, po co umieszczać kod onsubmit, ponieważ koncepcyjnie nie chcę sprawdzania poprawności onsubmit. Naprawdę chcę zatwierdzenia przycisku.
Kod jest nie tylko bardziej przejrzysty, ale także tam, gdzie musi być. Pamiętaj tylko: - Nie chcę, aby JavaScript weryfikował formularz (musi to zawsze robić PHP po stronie serwera) - Chcę pokazać użytkownikowi komunikat informujący, że wszystkie pola nie mogą być puste, wymaga JavaScript (klient bok)
Dlaczego więc niektórzy ludzie (pomyślcie lub powiedzcie mi), że trzeba to zrobić po jednorazowej weryfikacji? Nie, koncepcyjnie nie robię onsumbit sprawdzania poprawności po stronie klienta. Po prostu robię coś na naciśnięciu przycisku, więc dlaczego nie pozwolić, aby to zostało zaimplementowane?
Cóż, ten kod i styl doskonale sobie radzą. Na każdym JavaScript, który muszę wysłać, właśnie wstawiłem formularz:
I to pomija walidację, gdy jej nie potrzebuję. Po prostu wysyła formularz i ładuje inną stronę itp.
Ale jeśli użytkownik kliknie przycisk przesyłania (inaczej
type="button"
nietype="submit"
), sprawdzanie poprawności zostanie wykonane przed zezwoleniem na przesłanie formularza i, jeśli nie jest poprawne, nie zostanie wysłane.Mam nadzieję, że pomoże to innym osobom nie wypróbować długiego i skomplikowanego kodu. Po prostu nie używaj,
onsubmit
jeśli nie jest potrzebny, i używajonclick
. Ale należy pamiętać, aby zmieniaćtype="submit"
siętype="button"
i proszę nie zapomnieć zrobić tosubmit()
przez JavaScript.źródło
Zgadzam się z Shog9, chociaż zamiast tego mogę użyć:
Według w3schools The
<button>
tag ma różne zachowanie w różnych przeglądarkach.źródło
Załóżmy, że Twój formularz HTML ma
id="form_id"
Dodaj ten fragment jQuery do swojego kodu, aby zobaczyć wynik,
źródło
Możesz po prostu uzyskać odwołanie do przycisków za pomocą jQuery i zapobiec jego propagacji, jak poniżej:
źródło
e.preventDefault(); e.stopPropagation();
wystarczy, żeby wszystko działało.e.stopImmediatePropagation()
powoduje to błąd niezdefiniowanej metody w Chrome.$("form").submit(function () { return false; });
uniemożliwi to przesłanie przycisku lub możesz po prostu zmienić typ przycisku na „przycisk”<input type="button"/>
zamiast<input type="submit"/>
Który zadziała tylko wtedy, gdy ten przycisk nie jest jedynym przyciskiem w tym formularzu.źródło
Jest to błąd HTML5, jak już powiedziano, nadal możesz mieć przycisk jako przesłany (jeśli chcesz objąć zarówno javascript, jak i nie javascript), używając go w następujący sposób:
W ten sposób anulujesz wysyłanie, ale nadal będziesz robił wszystko, co robisz w funkcji jquery lub javascript, i wykonasz to dla użytkowników, którzy nie mają javascript.
źródło
Jestem pewien, że na FF
wystąpił błąd JavaScript, nie dzieje się tak w IE
Gdy pojawi się błąd javascript, kod „return false” nie będzie działał, co spowoduje odesłanie strony
źródło
Zwracane false uniemożliwia zachowanie domyślne. ale false zwraca, że dodatkowe zdarzenia związane z kliknięciem są przerywane. Oznacza to, że po wywołaniu tej funkcji istnieją inne powiązania kliknięcia, te inne nie biorą pod uwagę.
Lub po prostu możesz to tak ułożyć
źródło
Wystarczy dodać
e.preventDefault();
metodę, aby zapobiec przesyłaniu formularzy przez stronę.Według dokumentów MDN Web Docs
źródło
źródło
Możesz zwrócić false na końcu funkcji lub po wywołaniu funkcji.
Tak długo, jak będzie to ostatnia rzecz, która się stanie, formularz nie zostanie przesłany.
źródło
Oto proste podejście:
źródło
Poniższy przykładowy kod pokazuje, jak uniemożliwić przesłanie formularza przyciskiem kliknięcia.
Możesz wypróbować mój przykładowy kod:
źródło
Nie jestem w stanie tego teraz przetestować, ale wydaje mi się, że możesz użyć metody preventDefault w jQuery .
źródło
Funkcja removeItem faktycznie zawiera błąd, który powoduje, że przycisk formularza wykonuje swoje domyślne zachowanie (przesłanie formularza). W tym przypadku konsola błędów javascript zwykle podaje wskaźnik.
Sprawdź funkcję removeItem w części javascript:
Linia:
nie działa Spróbuj zamiast tego:
źródło