Formularze - 3 x submit
Czasami istnieje potrzeba, aby umieścić w jednym formularzu kilka przycisków 'submit' - zobacz przykład. W przeglądarkach Internet Explorer i Opera zauważymy, że niezależnie od wybranego pola tekstowego podświetlony zostanie zawsze pierwszy submit (screen).
Z punktu widzenia użyteczności, takie zachowanie przeglądarek nie jest mile widziane. Użytkownicy będą wprowadzani w błąd - podświetlenie innego submit'a będzie mylnie sugerowało jego użycie.
W przeglądarce Firefox żaden 'submit' nie zostanie podświetlany - jednak nie oznacza to, że problem nie istnieje.
Formularze w których użyto więcej niż jednego submit'a możemy znaleźć na forach dyskusyjnych (przyciski 'podgląd' i 'wyślij') w takich przypadkach opisywany problem nie ma znaczenia (nawet może być korzystny). Jednak w niektórych formularzach nie możemy sobie pozwolić na takie zachowania przeglądarek.
Czary-mary, hokus-focus()
Musimy znaleźć sposób, aby przy wypełnianiu danego pola formularza uzyskać focus odpowiedniego submit'a. Teoretycznie użycie funkcji focus() w JavaSript rozwiązuje problem - klikając w wybrane pole formularza podświetla się nam odpowiedni submit - przykład. Jednak brak możliwości normalnego korzystania z formularza dyskwalifikuje tą metodę.
Próba ustawiania focus'u dla dwóch elementów jednocześnie również zakończyła się niepowodzeniem.
Usunięcie focus'u
Jeśli nie można zmusić przeglądarki do podświetlenia odpowiedniego submit'a za pomocą JS*, to spróbujemy pozbyć się całkowicie podświetlenia - nie będzie to miało wpływu na użyteczność formularza (dla użytkowników Firefox'a to normalność).
Zawsze podświetlany jest pierwszy submit, stworzymy więc jeden dodatkowy na początku formularza i dodamy:
style="display: none;"
W Operze wszystko działa. IE natomiast okazał się 'mądrzejszy' i teraz podświetla drugi submit (pierwszy widoczny dla użytkownika) - przykład.
Trzeba przekonać IE, że nasz ukryty submit jest nadal widoczny:
style="position: absolute; left: -666px;"
Pozycjonowanie absolutne zadziałało - przykład.
Wady ...
Input typu 'submit' działa podobnie jak input typu 'text' - nadając odpowiedni 'name' możemy wysłać ciąg znaków określony w 'value'.
Jednak w przeciwieństwie do input'a typu 'text' (gdzie dane z wszystkich pól są wysyłane), tutaj zostaną wysłane jedynie te przypisane do użytego przycisku - dzięki temu możliwe jest określenie który submit został użyty (w niektórych sytuacjach jest to bardzo istotne).
W przypadku gdy zostanie wciśnięty 'Enter', będzie to równoznaczne z użyciem pierwszego submit'a w formularzu (również w Firefox'ie).
Rozwiązaniem może być zablokowanie możliwości wysłania formularza 'Enterem' - jednak nie zawsze to zadziała (wyłączona obsługa JS).
???
Czy istnieje całkowicie skuteczny sposób na opanowanie zachowań przeglądarek z formularzami zawierającymi kilka przycisków submit? Czekam na propozycje ...
Komentarze 385:
Nie lepiej rozdzielic taki formularz na trzy osobne?
Rozdzielenie na 3 formularze spowoduje, że nie będzie można wysłać danych z wszystkich pól za jednym razem.
Z pomocą przychodzą selektory CSS3. Poniższe zadziałało w testowej wersji Opery 9.20 i w Firefoksie 2.0.0.2. Oczywiście, nie działa w IE6, w IE7 nie mam możliwości sprawdzić. Ale użytkownicy IE dostają to, na co zasługują.
A teraz gwóźdź programu:
input[type="text"]:focus ~ input[type="submit"] {
background-color: red;
}
Warunkiem działania jest użycie <fieldset> do rozdzielenia grup pól formularza z własnym submitem.
PS.
30 znaków to zbyt mało na wpisanie adresu strony.
Działa (Opera 9.0 i Firefox 2.0.0.2), muszę jeszcze gdzieś sprawdzić IE7.
Ewentualnie dla IE6 (IE7) można użyć JS do odpowiedniego ostylowania właściwego submit'a. Jednak problem z użytecznością nie znika (wręcz przeciwnie) - pierwszy submit nadal posiada focus, lecz nie jest on widoczny dla użytkownika. Zmiana wyglądu właściwego submit'a będzie błędnie sugerowała użytkownikowi, że można użyć klawisza 'Enter' do wysłania formularza.
Czytasz forum Webhelp, co? ;>
Ciekawe rzeczy można tam znaleźć, więc czytam ;)
Gdzieś czytałem, że na stronie w danej chwili tylko jeden element może posiadać focus.
"Rozdzielenie na 3 formularze spowoduje, że nie będzie można wysłać danych z wszystkich pól za jednym razem."
jesli chcesz wysylac dane z wszystkich pol za jednym razem to po kiego grzyba Ci trzy przyciski?
Po co? Prosty przykład: masz formularz dodawania komentarzy - jeden przycisk 'dodaj', a drugi 'podgląd'. Oczywiście sytuacje mogą być jeszcze bardziej skomplikowane. To zależy od tego, co chcemy osiągnąć.
Dodaj komentarz: