<przycisk> vs. <typ wejścia = „przycisk” />. Którego użyć?

1634

Podczas przeglądania większości witryn (w tym SO) większość z nich używa:

<input type="button" />

zamiast:

<button></button>
  • Jakie są główne różnice między nimi, jeśli w ogóle?
  • Czy istnieją uzasadnione powody, aby używać jednego zamiast drugiego?
  • Czy istnieją uzasadnione powody, aby je łączyć?
  • Czy używanie <button>wiąże się z problemami ze zgodnością, ponieważ nie jest powszechnie używane?
Aron Rotteveel
źródło

Odpowiedzi:

661
  • Oto strona opisująca różnice (w zasadzie możesz umieścić HTML w a <button></button>)
  • I kolejna strona opisująca, dlaczego ludzie unikają <button></button>(Wskazówka: IE6)

Kolejny problem z IE podczas używania <button />:

I kiedy mówimy o IE, ma kilka błędów związanych z szerokością przycisków. Tajemniczo doda dodatkowe dopełnienie, gdy próbujesz dodać style, co oznacza, że ​​musisz dodać mały hack, aby uzyskać kontrolę.

Tamas Czinege
źródło
186
Ta odpowiedź była w 2009 roku, ponieważ IE6 nie żyje teraz. Zakładam, że nie ma powodu, aby nie używać <button>teraz?
Rosdi Kasim
75
Jeśli chcą pirować, pozwól im zdobyć dobrą wersję twojej witryny. Upuść IE6, upuść IE7, niestety IE8 nadal potrzebuje wsparcia.
Jared
15
Według strony odliczania IE6 Microsoftu , zużycie IE6 w Chinach nadal osiąga (od stycznia 2014 r.) Około 22%. ie6death.com zauważa, że ​​obsługa IE6 kończy się 8 kwietnia 2014 r.
BryanH
54
Jak wielu żartuje, użytkownicy wciąż korzystający ze starych wersji IE są prawdopodobnie przyzwyczajeni do Internetu, wyglądając na okropnie zepsute.
jinglesthula
9
<button />ma również formatrybut (i powiązane atrybuty), dzięki czemu można go połączyć z formularzami w innych częściach treści dokumentu.
Gup3rSuR4c
327

Podobnie jak notatka dodatkowa, <button>niejawnie prześle, co może powodować problemy, jeśli chcesz użyć przycisku w formularzu bez jego przesłania. Zatem kolejny powód do korzystania <input type="button">(lub <button type="button">)

Edytuj - więcej szczegółów

Bez typu buttondomyślnie przyjmuje typsubmit . Nie ma znaczenia, ile przycisków przesyłania lub danych wejściowych znajduje się w formularzu, każdy z nich, który jest jawnie lub pośrednio wpisany jako prześlij, po kliknięciu prześle formularz.

Istnieją 3 obsługiwane typy przycisku

submit ||  "submits the form when clicked (default)"
reset  ||  "resets the fields in the form when clicked"
button ||  "clickable, but without any event handler until one is assigned"
Travis J
źródło
4
czy możesz dodać więcej szczegółów? co się stanie, jeśli istnieje wiele przycisków? czy to tylko typ = „prześlij”, który to robi?
Simon_Weaver
44
O, drogi W3C, dlaczego submitdomyślnie, gdy 99,9% formularzy ma wiele buttonz jednym submit ?!
2grit
13
Wiele formularzy ma również tylko jeden przycisk, którym jest przesłanie. Przypuszczam, że musiałem zadzwonić w taki czy inny sposób.
jinglesthula
5
To może być DUŻA gotcha! Mój kod testowy przesyła około 80% czasu, w przeciwnym razie był traktowany jak zwykły przycisk. OSTROŻNIE, gdy używasz <button> w <form>
Sydwell
4
@ mik01aj „Nie ma znaczenia, ile przycisków przesyłania lub danych wejściowych znajduje się w formularzu, a każdy z nich, który jest jawnie lub niejawnie wpisany jako„ Prześlij, po kliknięciu, prześle formularz ”. Czy to nie jest oczywiste? Każdy przycisk przesyłania powinien przesłać formularz. Po co to mówić? czego mi brakuje?
Beton Gannet
174

Ten artykuł wydaje się całkiem dobry przegląd różnicy.

Ze strony:

Przyciski utworzone za pomocą elementu BUTTON działają podobnie jak przyciski utworzone za pomocą elementu INPUT, ale oferują bogatsze możliwości renderowania: element BUTTON może zawierać treść. Na przykład element BUTTON, który zawiera obraz, działa podobnie i może przypominać element INPUT, którego typ jest ustawiony na „image”, ale typ elementu BUTTON zezwala na treść.

Element przycisku - W3C

Noldorin
źródło
44

Wewnątrz <button>elementu możesz umieścić treść, taką jak tekst lub obrazy.

<button type="button">Click Me!</button> 

Jest to różnica między tym elementem a przyciskami utworzonymi za pomocą tego <input>elementu.

Santhosh
źródło
4
+1, ponieważ <input />rzeczywiście jest pustką, a <button>nie jest
Sebastian
39

Zacytować

Ważne: jeśli użyjesz elementu przycisku w formularzu HTML, różne przeglądarki przesyłają różne wartości. Internet Explorer prześle tekst między tagami <button>i </button>, a inne przeglądarki prześlą zawartość atrybutu value. Użyj elementu wejściowego, aby utworzyć przyciski w formie HTML.

Od: http://www.w3schools.com/tags/tag_button.asp

Jeśli dobrze rozumiem, odpowiedzią jest zgodność i spójność wprowadzania danych między przeglądarkami

użytkownik54579
źródło
43
@Hawken Ta strona została napisana przez idiotów, którzy myśleli, że W3Schools udaje W3C. W rzeczywistości W3Schools nie jest ani lepsza, ani gorsza niż tysiące innych stron, które zajmują się tego rodzaju materiałami.
Pan Lister
w rzeczywistości zależy to od wersji IE i trybu IE - w3schools zaktualizował informacje od cytatu
Damien
12
@MrLister Rozmawiałem z ludźmi, którzy uważają, że W3Schools jest związane z W3C. Chociaż nie jestem pewien, czy zgadzam się z „odpowiedzialnością W3Fools za dostarczanie dokładnych informacji”, uważam, że dokładność W3Schools pozostawia wiele do życzenia i że jego krytycy niekoniecznie są idiotami. (Wiele się nauczyłem od W3S, kiedy było dobrze; nie dotrzymał kroku standardom.)
Marnen Laibow-Koser
17
@MrLister W3Schools jest najczęściej używanym nieoficjalnym źródłem informacji o technologiach internetowych. A jakość naprawdę do bani. Dlaczego ich nie wyróżnić? A jakie szczegóły popełniły błędy W3Fools? Wszystko tam wygląda dla mnie poprawnie.
Marnen Laibow-Koser
19

Zacytuję artykuł Różnica między kotwicami, wejściami i przyciskami :

Kotwice ( <a>element) reprezentują hiperłącza, zasoby, do których osoba może nawigować lub pobierać w przeglądarce. Jeśli chcesz pozwolić użytkownikowi przejść na nową stronę lub pobrać plik, użyj kotwicy.

Input ( <input>) oznacza pole danych: tak pewnych danych użytkownika, to znaczy, aby wysłać do serwera. Istnieje kilka typów wprowadzania związanych z przyciskami:

  • <input type="submit">
  • <input type="image">
  • <input type="file">
  • <input type="reset">
  • <input type="button">

Każdy z nich ma znaczenie, na przykład „ plik ” służy do przesłania pliku, „ reset ” czyści formularz, a „ przesłanie ” wysyła dane do serwera. Sprawdź referencje W3 w MDN lub W3Schools .

Przycisk ( <button>)elementem jest dość wszechstronny:

  • możesz zagnieżdżać elementy w przycisku, takie jak obrazy, akapity lub nagłówki;
  • przyciski mogą również zawierać ::beforei ::afterpseudoelementy;
  • przyciski obsługują ten disabledatrybut. Ułatwia to ich włączanie i wyłączanie.

Ponownie sprawdź referencję W3 dla <button>znacznika w MDN lub W3Schools .

Attilio
źródło
17

Cytując stronę formularzy w podręczniku HTML:

Przyciski utworzone za pomocą elementu BUTTON działają podobnie jak przyciski utworzone za pomocą elementu INPUT, ale oferują bogatsze możliwości renderowania: element BUTTON może zawierać treść. Na przykład element BUTTON, który zawiera obraz, działa podobnie i może przypominać element INPUT, którego typ jest ustawiony na „image”, ale typ elementu BUTTON zezwala na treść.

gimel
źródło
17

Użyj przycisku z elementu wejściowego, jeśli chcesz utworzyć przycisk w formularzu. I użyj tagu przycisku, jeśli chcesz utworzyć przycisk dla akcji.

nickomarsa
źródło
9
Do skryptów po stronie klienta. <input type = "button"> nie ma funkcji w HTML.
iGEL
12
<button>
  • domyślnie zachowuje się tak, jakby miał atrybut „type =” submission
  • może być używany bez formularza, a także w formularzach.
  • dozwolona zawartość tekstowa lub HTML
  • dozwolone pseudoelementy css (jak: przed)
  • nazwa znacznika jest zwykle unikalna dla pojedynczego formularza

vs.

<input type='button'>
  • typ powinien być ustawiony na „prześlij”, aby zachowywał się jak element podający
  • można używać tylko w formularzach.
  • dozwolona tylko treść tekstowa
  • brak pseudoelementów css
  • taka sama nazwa znacznika jak większość elementów formularzy (danych wejściowych)

-
we współczesnych przeglądarkach oba elementy można łatwo stylizować za pomocą css, ale w większości przypadków buttonpreferowany jest element, ponieważ możesz stylizować więcej za pomocą wewnętrznego html i pseudoelementów

Sergey Sklyar
źródło
9

Jeśli chodzi o styl CSS, jest <button type="submit" class="Btn">Example</button>to lepsze, ponieważ daje możliwość korzystania z CSS :beforei :after pseudoklas, które mogą pomóc.

Ze względu na <input type="button">wizualne renderowanie inne niż <a>lub w <span>stylu z klasami w niektórych sytuacjach unikam ich.

Warto zauważyć, że obecna najlepsza odpowiedź została napisana w 2009 roku. IE6 nie jest teraz problemem, więc <button type="submit">Wins</button>spójność stylizacji w moich oczach wychodzi na wierzch.

jnowland
źródło
9

Jest duża różnica, jeśli używasz jQuery. jQuery jest świadomy większej liczby zdarzeń na wejściach niż na przyciskach. W przypadku przycisków jQuery rozpoznaje tylko zdarzenia „kliknięcia”. W przypadku danych wejściowych jQuery jest świadomy zdarzeń „kliknięcia”, „skupienia” i „rozmycia”.

Zawsze możesz w razie potrzeby powiązać zdarzenia z przyciskami, ale pamiętaj, że zdarzenia, o których jQuery automatycznie wie, są różne. Na przykład, jeśli utworzyłeś funkcję, która była wykonywana za każdym razem, gdy na twojej stronie istniało zdarzenie „focusin”, dane wejściowe wyzwalałyby tę funkcję, ale przycisk nie.

MattC
źródło
re: KjetilNordin - Mieliśmy aplikację, która była świadoma wszelkich zdarzeń focusin na stronie, a jedno wystąpiło, miało miejsce działanie. Więc jeśli używasz danych wejściowych, możesz obejrzeć wszystkie elementy dla pojedynczego zdarzenia. Nie mówię, że powinieneś, ale możesz. Ryzyko polega na tym, że ktoś zmieni dane wejściowe na przycisk, a następnie nie nastąpi fokus, a następnie nie nastąpi akcja, a następnie aplikacja zacznie bum. Tak się nam stało. :)
MattC
1
używaj zdarzeń skupienia, gdy element jest obecnie celem za pomocą myszy / klawiatury. pokazują użytkownikowi, gdzie są w dokumencie.
Albert
7

<button>jest elastyczny, ponieważ może zawierać HTML. Co więcej, o wiele łatwiej jest stylizować za pomocą CSS, a stylizacja faktycznie jest stosowana we wszystkich przeglądarkach. Istnieją jednak pewne wady dotyczące Internet Explorera (Eww! IE!). Internet Explorer nie wykrywa poprawnie atrybutu wartości, używając wartości znacznika jako wartości. Wszystkie wartości w formularzu są wysyłane po stronie serwera, niezależnie od tego, czy przycisk zostanie kliknięty, czy nie. To sprawia, że ​​używanie go jako <button type="submit">podstępnego i bolesnego.

<input type="submit">z drugiej strony nie ma żadnych problemów z wartością lub wykrywaniem, ale nie można jednak dodawać HTML tak, jak można <button>. Jest również trudniejszy do stylizacji, a stylizacja nie zawsze dobrze reaguje we wszystkich przeglądarkach. Mam nadzieję, że to pomogło.

Moh S.
źródło
7

Chcę tylko dodać coś do pozostałych odpowiedzi tutaj. Elementy wejściowe są uważane za puste lub puste (pozostałe puste elementy to: area, base, br, col, hr, img, input, link, meta i param. Możesz również sprawdzić tutaj ), co oznacza, że ​​nie mogą mieć żadnej treści. Oprócz braku zawartości puste elementy nie mogą mieć żadnych pseudoelementów, takich jak :: after i :: before , co uważam za poważną wadę.

Roumelis George
źródło
4

ponadto jedna z różnic może pochodzić od dostawcy biblioteki i tego, co kodują. na przykład tutaj używam platformy Cordova w połączeniu z mobilnym kątowym interfejsem użytkownika i chociaż tagi input / div / etc działają dobrze z ng-click, przycisk może spowodować awarię debugera Visual Studio, z pewnością z powodu różnic spowodowanych przez programistę; zauważ, że odpowiedź MattC wskazuje na ten sam problem, jQuery to po prostu biblioteka, a dostawca nie pomyślał o niektórych funkcjach w jednym elemencie, który zapewnia w innym. więc gdy korzystasz z biblioteki, możesz napotkać problem z jednym elementem, z którym nie spotkasz innego. i po prostu popularny, taki jak input, będzie w większości ustalony, tylko dlatego, że jest bardziej popularny.

deadManN
źródło
4

Chociaż jest to bardzo stare pytanie i może nie być już istotne, należy pamiętać, że większość problemów, które <button>kiedyś występowały w tagu, już nie istnieje i dlatego zaleca się jego użycie.

Jeśli nie możesz tego zrobić z różnych powodów, pamiętaj o dodaniu atrybutu rola = ”przycisk” w tagu jako ułatwienia dostępu. Ten artykuł jest dość pouczający: https://www.deque.com/blog/accessible-aria-buttons/

Nasia Makrygianni
źródło