Ignorowanie akcji "submit" po nacisnieciu klawisza enter w formularzu

0

Chciałbym uodpornić moje pola na enter? Nie chcę aby naciśnięcie powodowało wywołanie submit. Jakie rozwiązanie proponujecie? JS?

0

Masakra! Co to za tytul watku? "Odpornosc na enter"? Proponuje najpierw zapoznac sie z: Jak tytułować wątki na forum?

Odpowiadajac na pytanie:

<form name="submit" onsubmit="return false;">

Usunac z formularza kod <input type="submit" /> odpowiadajacy za przycisk typu submit. Zamiast tego umiescic przycisk <input type="button" value="Wyslij" />. Dodac do niego zdarzenie onclick:

<input type="button" onclick="documents.forms['submit'].submit();" value="Wyslij" />
0

Nie wiem czy niepoprawnie mam zrobiony formularz ale przyciski robię w inny sposób:

<button name="zapytaniesql">Wyślij</button>

Znalazłem takie rozwiązanie:

$('input[type="text"]').bind('keypress', function(e) {
        if(e.keyCode==13){
        		alert('test');
        }
	});

Alert się pojawia ale oprócz tego wykonuje wysłanie.

0

Te rozwiazanie to przerost formy nad trescia. Ale jak chcesz...

Po alercie musisz dodac:

e.preventDefault(); return false;
1

@Adam Boduch:
@logoszoi:
A ja pozgredzę, że oba przedstawione tu rozwiązania mi się nie do końca podobają, ale preferowałbym to drugie -- ze sprawdzeniem wciśniętego przycisku. To pierwsze najwyraźniej polega na JavaScripcie by wysłać formularz, co prawie zawsze jest wg mnie be (wyjątek to np. forum, gdzie specjalnie wymaga się JS-u by niezalogowani użytkownicy nie mogli pisać postów bez JS-u -- to taka ochrona przed botami). Nie każdemu musi się też podobać mieszanie warstw, czyli JS-u z HTML-em.

I to drugie rozwiązanie jest jednak zapisane w sposób... odbiegający od optymalnego.

Nie potrzeba wcale dawać naraz e.preventDefault() oraz return false;. jQuery normalizuje obiekty zdarzeń i zapewnia działającą metodę preventDefault w każdej przeglądarce. Zresztą, gdyby nie normalizowało, to następna linijka i tak by nie była wykonana, bo brak preventDefault, a nawet samego argumentu e w starym IE powodowałby rzucenie błędu ReferenceError.

Należy i wystarczy użyć preventDefault i niczego więcej -- żadnego return false! Nie róbmy tego samego dwukrotnie! (Don't Repeat Yourself!) [ponieważ to "podwójne" rozwiązanie zaproponował bardzo dobry programista, przyjmuję do wiadomości że może jest coś, o czym ja nie wiem -- w takim wypadku proszę o oświecenie mnie ;)]

Kolejna sprawa: zamiast e.keyCode powinno się użyć e.which, które jest własnością normalizowaną przez jQuery, powstałą na bazie e.keyCode oraz e.charCode. W prostym przypadku sprawdzania ENTER-a to nie jest sprawa krytyczna, ale skoro używamy jQuery to czemu nie używać zalecanych w dokumentacji własności? (źródło: http://api.jquery.com/event.which/ )

I coś jeszcze drobniejszego, w zasadzie to kwestia uznaniowa: zamiast e.bind('keypress', foo) można użyć skrótu e.keypress(foo).

I coś związane z jakością: lepiej ominąć magiczną liczbę 13 i zamiast tego użyć pseudo(stałej) objaśniającej o jaki przycisk chodzi. W tym przypadku można tę stałą wstawić nawet do samej funkcji obsługi zdarzenia -- nie spowoduje to mierzalnego pogorszenia responsywności.

Koniec końców:

$('input[type="text"]').keypress(function(e) {
  var ENTER_KEY = 13;
  if (e.which === ENTER_KEY){
    e.preventDefault();
  }
});

1 użytkowników online, w tym zalogowanych: 0, gości: 1