<button> vs. <input type = “button” />. Quale usare?


1635

Quando guardano la maggior parte dei siti (incluso SO), la maggior parte di essi usa:

<input type="button" />

invece di:

<button></button>
  • Quali sono le principali differenze tra i due, se presenti?
  • Ci sono validi motivi per utilizzare l'uno anziché l'altro?
  • Ci sono validi motivi per usarli insieme?
  • L'utilizzo <button>comporta problemi di compatibilità, visto che non è molto utilizzato?

Risposte:


662

Un altro problema di IE quando si utilizza <button />:

E mentre stiamo parlando di IE, ha un paio di bug relativi alla larghezza dei pulsanti. Aggiungerà misteriosamente un'imbottitura extra quando stai cercando di aggiungere stili, il che significa che devi aggiungere un piccolo hack per tenere le cose sotto controllo.


186
Questa risposta è stata nel 2009, dato che IE6 è morto ora suppongo che non ci sia motivo di non usarlo <button>ora?
Rosdi Kasim,

75
Se vogliono piratare, lascia che ottengano una versione schifosa del tuo sito. Rilasciare IE6, rilasciare IE7, purtroppo IE8 ha ancora bisogno di supporto.
Jared

15
Secondo la pagina del conto alla rovescia di Microsoft IE6 , l'utilizzo di IE6 in Cina sta ancora registrando (a gennaio 2014) circa il 22%. ie6death.com nota che il supporto IE6 termina l'8 aprile 2014.
BryanH,

54
Come molti hanno scherzato, gli utenti ancora su vecchie versioni di IE sono probabilmente abituati a Internet che sembrano orribilmente rotti.
jinglesthula,

9
<button />ha anche un formattributo (e attributi correlati) in modo che possa essere collegato ai moduli in altre parti del corpo del documento.
Gup3rSuR4c

327

Proprio come una nota a margine, <button>verrà implicitamente inviato, il che può causare problemi se si desidera utilizzare un pulsante in un modulo senza l'invio. Pertanto, un altro motivo per utilizzare <input type="button">(o <button type="button">)

Modifica : maggiori dettagli

Senza un tipo, buttonriceve implicitamente il tipo disubmit . Non importa quanti pulsanti di invio o input ci sono nel modulo, ognuno di essi che viene digitato in modo esplicito o implicito come invia, quando viene cliccato, invierà il modulo.

Esistono 3 tipi supportati per un pulsante

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"

4
puoi aggiungere più dettagli? cosa succede se ci sono più pulsanti? è solo type = 'submit' che fa questo?
Simon_Weaver,

44
Oh caro W3C, perché submitdi default quando il 99,9% dei moduli ne ha molti buttoncon uno submit ?!
2grit

13
Molti moduli hanno anche solo un pulsante, che è l'invio. Ho dovuto fare una telefonata in un modo o nell'altro, suppongo.
jinglesthula,

5
Questo può essere GRANDE gotcha! Il mio codice di prova invia circa l'80% delle volte, altrimenti è stato trattato come un normale pulsante. DIVENTANDO quando si utilizza <button> in un <form>
Sydwell

4
@ mik01aj "Non importa quanti pulsanti di invio o input ci sono nel modulo, ognuno di essi che viene digitato in modo esplicito o implicito come submit, quando viene cliccato, invierà il modulo." Non è ovvio? Qualsiasi pulsante di invio deve inviare il modulo. Perché dire questo? Cosa mi sto perdendo?
Concrete Gannet,

174

Questo articolo sembra offrire una panoramica abbastanza buona della differenza.

Dalla pagina:

I pulsanti creati con l'elemento BUTTON funzionano esattamente come i pulsanti creati con l'elemento INPUT, ma offrono possibilità di rendering più complete: l'elemento BUTTON può avere contenuto. Ad esempio, un elemento PULSANTE che contiene un'immagine funziona come e può assomigliare a un elemento INPUT il cui tipo è impostato su "immagine", ma il tipo di elemento PULSANTE consente il contenuto.

L'elemento Button - W3C


44

All'interno di un <button>elemento puoi inserire contenuti, come testo o immagini.

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

Questa è la differenza tra questo elemento e i pulsanti creati con l' <input>elemento.


4
+1, poiché <input />è davvero un elemento vuoto, mentre <button>non lo è
Sebastian

39

Citazione

Importante: se si utilizza l'elemento del pulsante in un modulo HTML, browser diversi invieranno valori diversi. Internet Explorer invierà il testo tra i tag <button>e </button>, mentre altri browser invieranno il contenuto dell'attributo value. Utilizzare l'elemento di input per creare pulsanti in un modulo HTML.

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

Se ho capito bene, la risposta è compatibilità e coerenza di input da browser a browser


43
@Hawken Quella pagina è stata scritta da idioti che pensavano che W3Schools fingesse di essere W3C. In realtà, W3Schools non è migliore o peggiore di migliaia di altri siti che gestiscono questo tipo di materiale.
Lister

in realtà, dipende dalla versione di IE e dalla modalità IE - w3schools ha aggiornato le informazioni dalla citazione
Damien,

12
@MrLister Ho parlato con persone che pensano che W3Schools sia associato al W3C. Anche se non sono sicuro di essere d'accordo con la "responsabilità di W3Fools di fornire informazioni accurate", penso che l'accuratezza di W3Schools lasci qualcosa a desiderare e che i suoi critici non siano necessariamente idioti. (Ho imparato molto dal W3S, quando era buono; non ha tenuto il passo con gli standard.)
Marnen Laibow-Koser,

17
@MrLister W3Schools è facilmente la fonte non ufficiale più utilizzata per le informazioni sulla tecnologia Web. E la qualità fa davvero schifo. Perché non individuarli? E quali dettagli hanno sbagliato W3Fools? Tutto lì mi sembra corretto.
Marnen Laibow-Koser,

19

Citerò l'articolo La differenza tra ancore, input e pulsanti :

Le ancore (l' <a>elemento) rappresentano collegamenti ipertestuali, risorse a cui una persona può navigare o scaricare in un browser. Se si desidera consentire all'utente di spostarsi in una nuova pagina o scaricare un file, utilizzare un ancoraggio.

Un input ( <input>) rappresenta un campo dati: quindi alcuni dati utente che intendi inviare al server. Esistono diversi tipi di input relativi ai pulsanti:

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

Ognuno di essi ha un significato, ad esempio " file " viene utilizzato per caricare un file, " reset " cancella un modulo e " submit " invia i dati al server. Controlla il riferimento W3 su MDN o su W3Schools .

Il pulsante (l' <button>)elemento è abbastanza versatile:

  • puoi annidare elementi all'interno di un pulsante, come immagini, paragrafi o intestazioni;
  • i pulsanti possono anche contenere ::beforee ::afterpseudo-elementi;
  • i pulsanti supportano l' disabledattributo. Questo rende facile accenderli e spegnerli.

Ancora una volta, controlla il riferimento W3 per il <button>tag su MDN o su W3Schools .


17

Citando la pagina dei moduli nel manuale HTML:

I pulsanti creati con l'elemento BUTTON funzionano esattamente come i pulsanti creati con l'elemento INPUT, ma offrono possibilità di rendering più complete: l'elemento BUTTON può avere contenuto. Ad esempio, un elemento BUTTON che contiene un'immagine funziona come e può assomigliare a un elemento INPUT il cui tipo è impostato su "immagine", ma il tipo di elemento BUTTON consente il contenuto.


17

Utilizzare il pulsante dall'elemento di input se si desidera creare il pulsante in un modulo. E usa il tag pulsante se vuoi creare un pulsante per un'azione.


9
Per scripting lato client. <input type = "button"> non ha alcuna funzione in HTML.
iGEL

12
<button>
  • per impostazione predefinita si comporta come se avesse un attributo "type =" submit "
  • può essere utilizzato senza un modulo, nonché nei moduli.
  • contenuti di testo o html consentiti
  • pssudo elementi CSS ammessi (come: prima)
  • il nome del tag è in genere univoco per un singolo modulo

vs.

<input type='button'>
  • type dovrebbe essere impostato su 'submit' per comportarsi come un elemento di invio
  • può essere utilizzato solo nei moduli.
  • sono ammessi solo contenuti testuali
  • nessun pseudo elemento css
  • stesso nome tag della maggior parte degli elementi dei moduli (input)

-
nei browser moderni, entrambi gli elementi sono facilmente personalizzabili con CSS ma nella maggior parte dei casi, l' buttonelemento è preferito in quanto puoi modellare di più con html interno e pseudo elementi


9

Per quanto riguarda lo stile CSS, <button type="submit" class="Btn">Example</button>è meglio in quanto ti dà la possibilità di utilizzare CSS :beforee :after pseudo classi che possono aiutare.

A causa della <input type="button">resa visiva diversa da <a>o in <span>stile con classi in determinate situazioni, le evito.

Vale la pena notare che l' attuale risposta principale è stata scritta nel 2009. IE6 non è un problema al giorno d'oggi, quindi la <button type="submit">Wins</button>coerenza stilistica nei miei occhi viene fuori in cima.


9

C'è una grande differenza se stai usando jQuery. jQuery è a conoscenza di più eventi sugli input rispetto ai pulsanti. Sui pulsanti, jQuery è a conoscenza solo degli eventi "click". Sugli input, jQuery è a conoscenza degli eventi 'click', 'focus' e 'blur'.

Puoi sempre associare gli eventi ai tuoi pulsanti secondo necessità, ma tieni presente che gli eventi di cui jQuery è automaticamente a conoscenza sono diversi. Ad esempio, se hai creato una funzione che è stata eseguita ogni volta che c'era un evento 'focusin' sulla tua pagina, un input avrebbe attivato la funzione ma un pulsante no.


re: KjetilNordin - Avevamo un'applicazione che era a conoscenza di eventuali eventi focusin su una pagina e si è verificato uno, si è verificata un'azione. Quindi, se si utilizza un input, è possibile guardare tutti gli elementi per un singolo evento. Non dire che dovresti, ma potresti. Il rischio è che qualcuno cambi l'input in un pulsante, quindi la messa a fuoco non si verifica e quindi la tua azione non si verifica e quindi l'app diventa boom. Questo è quello che ci è successo. :)
MattC

1
utilizzare gli eventi di messa a fuoco quando un elemento è attualmente selezionato come mouse / tastiera. mostrano all'utente dove si trovano nel documento.
albert,

7

<button>è flessibile in quanto può contenere HTML. Inoltre, è molto più semplice definire lo stile utilizzando i CSS e lo stile viene effettivamente applicato a tutti i browser. Tuttavia, ci sono alcuni svantaggi riguardo a Internet Explorer (Eww! IE!). Internet Explorer non rileva correttamente l'attributo value, utilizzando il contenuto del tag come valore. Tutti i valori in un modulo vengono inviati al lato server, indipendentemente dal fatto che si faccia clic o meno sul pulsante. Questo rende l'utilizzo come un <button type="submit">trucco e un dolore.

<input type="submit">d'altra parte non ha alcun valore o problemi di rilevamento, ma non è possibile, tuttavia, aggiungere HTML come si può con <button>. È anche più difficile da applicare allo stile e lo stile non sempre risponde bene su tutti i browser. Spero che questo abbia aiutato.


7

Voglio solo aggiungere qualcosa al resto delle risposte qui. Gli elementi di input sono considerati elementi vuoti o vuoti (altri elementi vuoti sono area, base, br, col, hr, img, input, link, meta e param. Puoi anche controllare qui ), il che significa che non possono avere alcun contenuto. Oltre a non avere alcun contenuto, gli elementi vuoti non possono avere pseudo-elementi come :: after e :: before , che considero un grave svantaggio.


4

inoltre, una delle differenze può provenire dal fornitore della libreria e da cosa codificano. ad esempio qui sto usando la piattaforma Cordova in combinazione con l'interfaccia utente angolare mobile e mentre i tag input / div / etc funzionano bene con ng-click, il pulsante può causare l'arresto anomalo del debugger di Visual Studio, sicuramente a causa delle differenze, causato dal programmatore; nota che MattC risponde allo stesso problema, jQuery è solo una lib e il provider non ha pensato ad alcune funzionalità su un elemento, che fornisce su un altro. quindi quando si utilizza una libreria, è possibile che si verifichi un problema con un elemento, che non si dovrà affrontare con un altro. e semplicemente quello popolare input, sarà principalmente quello fisso, solo perché è più popolare.


4

Anche se questa è una domanda molto vecchia e potrebbe non essere più pertinente, tieni presente che la maggior parte dei problemi che il <button>tag aveva non esiste più e quindi è altamente consigliabile usarla.

Nel caso in cui non sia possibile farlo per vari motivi, tieni presente solo di aggiungere l'attributo ruolo = "pulsante" nel tag al momento dell'accessibilità. Questo articolo è piuttosto informativo: https://www.deque.com/blog/accessible-aria-buttons/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.