Posso nidificare un elemento <button> all'interno di un <a> usando HTML5?


145

Sto facendo quanto segue:

 <a href="www.stackoverflow.com">
   <button disabled="disabled" >ABC</button>
 </a>  

Funziona bene, ma viene visualizzato un errore di convalida HTML5 che dice "L'elemento" pulsante "non deve essere nidificato nell'elemento" un pulsante ".

Qualcuno può darmi consigli su cosa dovrei fare?


8
Il validatore ha già risposto alla tua domanda e ti ha persino spiegato perché non è valido in quel messaggio di errore.
Codice inutile

1
Ma c'è un'alternativa se voglio che Google sia in grado di vederlo come un link. Come esempio di utilizzo dei pulsanti ho pulsanti chiamati "<<" e ">>" per il record successivo e il record precedente. Credo che questi dovrebbero essere pulsanti, ma la funzionalità è che si collegano a nuove pagine.
Marie,

3
la mia domanda è: importa se fai questa meritata eccezione.
Muhammad Umer,

1
Se inserisco <button> <a href="dsada.html"> Test </a> </button> non funziona su Internet Explorer 11 o Firefox.
dutraveller,

Risposte:


231

No , non è un HTML5 valido secondo il documento sulle specifiche HTML5 del W3C :

Modello di contenuto: trasparente , ma non deve esserci discendente di contenuto interattivo .

L'elemento a può essere racchiuso in interi paragrafi, elenchi, tabelle e così via, anche in intere sezioni, purché non vi sia contenuto interattivo (ad es. Pulsanti o altri collegamenti).

In altre parole, puoi annidare qualsiasi elemento all'interno di un <a>tranne quanto segue:

  • <a>

  • <audio>(se l' attributo controlli è presente)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(se l' attributo usemap è presente)

  • <input>(se l' attributo type non è nello stato nascosto )

  • <keygen>

  • <label>

  • <menu>(se l' attributo type si trova nello stato della barra degli strumenti )

  • <object>(se l' attributo usemap è presente)

  • <select>

  • <textarea>

  • <video>(se l' attributo controlli è presente)


Se stai cercando di avere un pulsante che si collega a un punto, avvolgi quel pulsante all'interno di un <form>tag come tale:

<form style="display: inline" action="http://example.com/" method="get">
  <button>Visit Website</button>
</form>

Tuttavia, se il tuo <button>tag è in stile usando CSS e non assomiglia al widget del sistema ... Fatti un favore, crea una nuova classe per il tuo <a>tag e lo stile allo stesso modo.


1
@Andrew Moore - C'è un altro modo. Credo che ciò abbia dato problemi ed è per questo che è stato modificato per essere all'interno di un <a> link. Non sono sicuro di quale sia stato il problema, ma abbiamo molti di questi pulsanti come questo in una pagina. Forse perché volevamo migliorare la SEO usando i collegamenti <a>.
Marie,

2
@Marie: non c'è altro modo che assegnare uno stile ai tuoi collegamenti per sembrare pulsanti.
Andrew Moore,

3
user25 not is non è meglio usare method = "post" perché il browser richiede di inviare di nuovo un modulo post durante la navigazione avanti e indietro. Poiché GET è il metodo predefinito di un modulo, si può lasciare method = "get" per brevità.
Bijan,

4
@AndrewMoore: lo stile di un collegamento per assomigliare a un pulsante crea il proprio insieme di problemi, come ad esempio per l'accessibilità. Un pulsante dovrebbe essere eseguito quando è attivo e si preme la barra spaziatrice. Un collegamento no. Se ti interessa l'ADA (o sei obbligato a fingere di preoccuparti), questo potrebbe morderti.
iconoclasta,

2
Come suggerito da @jonaspas, <div>all'interno <a>è assolutamente valido in HTML5: validator.w3.org/nu/…
Socob

43

Se stai usando Bootstrap 3 , funziona abbastanza bene

<a href="#" class="btn btn-primary btn-lg active" role="button">Primary link</a>
<a href="#" class="btn btn-default btn-lg active" role="button">Link</a>

non funziona bene con un'icona fantastica di carattere pulsante rotondo all'interno
Toolkit

L'uso di class = 'btn btn-default' corrisponde agli altri pulsanti (MVC6).
crokusek,

12

No.

La seguente soluzione si basa su JavaScript.

<button type="button" onclick="location.href='http://www.stackoverflow.com'">ABC</button>

Se il pulsante deve essere inserito in un esistente <form>con method="post", assicurarsi che il pulsante abbia l'attributo, type="button"altrimenti il ​​pulsante invierà l'operazione POST. In questo modo è possibile avere un file <form>contenente una combinazione di pulsanti operativi GET e POST.


onclick non funzionerà con il protocollo di file, quindi non è utile per la presentazione statica, ad esempio. in questo caso, la propensione all'azione è la strada da percorrere.
netalex,

1
Se il pulsante è collegato a una pagina, non è un pulsante, è un'ancora
Capsule

@Capsule è così comune vedere in questi giorni. Basta guardare la landing page per ogni framework di sviluppo web esistente. Di solito sono tutto per l'argomento purista, ma anche devo ammettere che un grosso pulsante rettangolare ha una convenienza migliore, più ovvia di un collegamento, anche se si collega a una pagina invece di avviare una vera azione di forma.
TheDudeAbides

In questo momento ho un backup <a>interno <button>(con lo stesso href) di JS se JS è disabilitato, e tra sei mesi sarò sicuramente imbarazzato di averlo ammesso.
TheDudeAbides

@TheDudeAbides Non ne sto parlando dell'aspetto, sto prendendo in considerazione il markup che vuoi usare. Cosa ti impedisce di definire questo link come un grosso pulsante rettangolare? A meno che il tuo sito non usi affatto stili? tra la risposta sopra quella di cui stiamo commentando ne è un perfetto esempio. È un tag di ancoraggio, disegnato come un pulsante.
Capsule

10

Sono appena passato allo stesso problema e l'ho risolto sostituendo il tag "button" al tag "span". Nel mio caso sto usando bootstrap. Ecco come appare:

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 

4
Con bootstrap non hai assolutamente bisogno dell'intervallo. Basta spostare l'intera parte della classe in <a> e avrai un pulsante di collegamento. ad es. <a href="#register" class="btn btn-default btn-lg"> Iscriviti </a>
Ryan Buddicom il

Il poster originale ha chiesto se è possibile posizionare un pulsante all'interno di un tag di ancoraggio. La risposta accettata osserva che va contro le specifiche del W3C inserire un <a> all'interno di un <a>. Penso che sia per questo che golbeltri stava dimostrando di abbinare un <span> come pulsante.
StackOverflowUser

Questo ha senso se ci sono altri contenuti all'interno di <a>, che fa parte del collegamento, ma non in stile come un pulsante. Ad esempio, qualsiasi clic all'interno di un div(immagine, sfondo, testo, ecc.) Va a un collegamento, ma solo l' spanaspetto di un pulsante.
Josiah,

7

Sarebbe davvero strano se fosse valido e mi aspetterei che non fosse valido. Cosa dovrebbe significare avere un elemento cliccabile all'interno di un altro elemento cliccabile? Che cos'è - un pulsante o un collegamento?


Grazie Steve. Questo era un metodo che mi è stato suggerito da un collaboratore. Il metodo funziona. C'è un modo migliore per farlo?
Marie,

1
@Marie Se vuoi che un link assomigli a un pulsante, è facile usare gli stili CSS per farlo sembrare tale. Aggiungere uno stile di bordo simile a questo: border: 2px outset. Se vuoi arrotondare un po 'gli angoli, puoi usare anche un raggio del bordo. Anche un semplice <img>tag funzionerebbe bene.
Codice inutile

3

Un'altra opzione è utilizzare l'attributo onclick del pulsante:

<button disabled="disabled" onClick="location.href='www.stackoverflow.com'" >ABC</button>

Questo funziona, tuttavia, l'utente non vedrà il link visualizzato al passaggio del mouse come farebbe se fosse all'interno dell'elemento.


2

In questi giorni, anche se le specifiche non lo consentono, "sembra" funzionare ancora per incorporare il pulsante all'interno di un <a href...><button ...></a>tag, FWIW ...


2
Funziona quando <button>non è contenuto in a <form>. Tuttavia, non appena il pulsante è contenuto (ad es. <form>...<a><button>) , Questo smette di funzionare, a meno che non si disabiliti il ​​gestore al clic del pulsante. Ciò è sufficiente per giustificare l'evitamento di questo scenario.
vescovo

0

È possibile aggiungere una classe al pulsante e inserire alcuni script reindirizzandolo.

Lo faccio in questo modo:

<button class='buttonClass'>button name</button>

<script>
$(".buttonClass').click(function(){
window.location.href = "http://stackoverflow.com";
});
</script>

0

perché no .. puoi anche incorporare l'immagine sul pulsante

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 

2
Il problema è che <a> </a> come richiesto dall'OP allora è un po 'restrittivo in ciò che consente di essere all'interno dei suoi confini. Vedi la domanda accettata lì.
Thomas,


-1

È illegale in HTML5 incorporare un elemento pulsante all'interno di un collegamento.

Meglio usare CSS sui valori predefiniti e: active (premuto):

body{background-color:#F0F0F0} /* JUST TO MAKE THE BORDER STAND OUT */
a.Button{padding:.1em .4em;color:#0000D0;background-color:#E0E0E0;font:normal 80% sans-serif;font-weight:700;border:2px #606060 solid;text-decoration:none}
a.Button:not(:active){border-left-color:#FFFFFF;border-top-color:#FFFFFF}
a.Button:active{border-right-color:#FFFFFF;border-bottom-color:#FFFFFF}
<p><a class="Button" href="www.stackoverflow.com">Click me<a>


-2

Provo le tue soluzioni javascript ma, per lavoro, devo inserire il e.preventDefault();nella mia funzione javascript.

<!-- Add your HTML !-->
<a id="id_primary_link" href="my_primary_link.php">
  <button onclick="my_trick_function('my_secondary_link.php')">
</a>


<!-- Add your javascript function !-->
<script>
function my_trick_function(secondary_link){
    $('#id_primary_link').click(function(e) {
        e.preventDefault();
        window.location.replace(secondary_link);
    });
}   
</script>   

-3

Usa l'attributo formaction all'interno del pulsante

PS! Funziona solo se il tuo pulsante type = "submit"

<button type="submit" formaction="www.youraddress.com">Submit</button>

devi anche inserire il pulsante in un tag <form>.
denodster,

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
Oppure puoi usare lo script java nel pulsante come:

<button type="submit" onclick="myFunction()">Submit</button>
<script>
  function myFunction() {
      var w = window.open(file:///E:/Aditya%20panchal/index.html);
    }
</script>


Basta diventare alcuni browser lo permetterà, non significa che sia una buona idea.
denodster,
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.