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 384:

  • » Viktor: 10.03.2007 o 23:15

    Nie lepiej rozdzielic taki formularz na trzy osobne?

  • » Adriano: 11.03.2007 o 10:39

    Rozdzielenie na 3 formularze spowoduje, że nie będzie można wysłać danych z wszystkich pól za jednym razem.

  • » Don_jaro: 11.03.2007 o 15:36

    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.

  • » Adriano: 11.03.2007 o 20:20

    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.

  • » Riddle: 12.03.2007 o 03:23

    Czytasz forum Webhelp, co? ;>

  • » Adriano: 12.03.2007 o 18:20

    Ciekawe rzeczy można tam znaleźć, więc czytam ;)

  • » Paweł: 12.03.2007 o 23:17

    Gdzieś czytałem, że na stronie w danej chwili tylko jeden element może posiadać focus.

  • » lol: 08.02.2008 o 17:18

    "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?

  • » Adriano: 05.04.2008 o 22:50

    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:

Dostępne tagi: [link]http://adres-www[/link] [quote]cytat[/quote] [code]kod[/code] [pre]tekst preformowany[/pre] [b]bold[/b]