Chciałbym uodpornić moje pola na enter? Nie chcę aby naciśnięcie powodowało wywołanie submit. Jakie rozwiązanie proponujecie? JS?
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" />
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.
Te rozwiazanie to przerost formy nad trescia. Ale jak chcesz...
Po alercie musisz dodac:
e.preventDefault(); return false;
@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();
}
});