Posso aninhar um elemento <button> dentro de um <a> usando HTML5?

145

Eu estou fazendo o seguinte:

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

Isso funciona bem, mas recebo um erro de validação HTML5 que diz que "O elemento 'botão' não deve ser aninhado no elemento 'um botão'.

Alguém pode me dar conselhos sobre o que devo fazer?

Marie
fonte
8
O validador já respondeu sua pergunta e até mesmo lhe disse por que não é válido nessa mensagem de erro.
Código inútil
1
Mas existe uma alternativa se eu quiser que o Google consiga ver isso como um link. Como exemplo do uso de botões, tenho botões chamados "<<" e ">>" para o próximo registro e o registro anterior. Acredito que estes devem ser botões, mas a funcionalidade é que eles apontam para novas páginas.
18711 Marie
3
minha pergunta é que importa ... se você fizer essa exceção bem merecida.
Muhammad Umer
1
Se eu colocar <button> <a href="dsada.html"> Teste </a> </button>, ele não funcionará no Internet Explorer 11 ou Firefox.
precisa saber é o seguinte

Respostas:

231

Não , ele não é HTML5 válido, de acordo com o documento de especificação HTML5 do W3C :

Modelo de conteúdo: transparente , mas não deve haver descendente de conteúdo interativo .

O elemento a pode ser agrupado em parágrafos, listas, tabelas e assim por diante, até seções inteiras, desde que não exista conteúdo interativo (por exemplo, botões ou outros links).

Em outras palavras, você pode aninhar qualquer elemento dentro de um, <a>exceto o seguinte:

  • <a>

  • <audio>(se o atributo de controles estiver presente)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(se o atributo usemap estiver presente)

  • <input>(se o atributo type não estiver no estado oculto )

  • <keygen>

  • <label>

  • <menu>(se o atributo type estiver no estado da barra de ferramentas )

  • <object>(se o atributo usemap estiver presente)

  • <select>

  • <textarea>

  • <video>(se o atributo de controles estiver presente)


Se você estiver tentando ter um botão vinculado a algum lugar, envolva esse botão dentro de uma <form>tag como:

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

No entanto, se sua <button>tag é estilizada usando CSS e não se parece com o widget do sistema ... Faça um favor a si mesmo, crie uma nova classe para sua <a>tag e estilize-a da mesma maneira.

Andrew Moore
fonte
1
@ Andrew Moore - Existe outra maneira. Acredito que isso deu problemas e foi por isso que foi alterado para estar dentro de um link <a>. Não temos certeza do problema, mas temos muitos desses botões em uma página. Talvez fosse porque queríamos melhorar o SEO usando os links <a>.
187 Marie Marie
2
@ Marie: Não há outra maneira senão estilizar seus links para parecer botões.
Andrew Moore
3
user25 not is não é melhor usar method = "post" porque o navegador solicita o reenvio de um formulário de postagem ao navegar para frente e para trás. Como GET é o método padrão de um formulário, pode-se deixar method = "get" por breves instantes.
Bijan
4
@AndrewMoore: criar um link para parecer um botão cria seu próprio conjunto de problemas, como acessibilidade. Um botão deve ser executado quando estiver em foco e você pressionar a barra de espaço. Um link não. Se você se preocupa com a ADA (ou precisa fingir que se importa), isso pode ser algo que o incomoda.
Iconoclast
2
Como @jonaspas sugeriu, um <div>dentro de um <a>é absolutamente válido em HTML5: validator.w3.org/nu/…
#
43

Se você estiver usando o Bootstrap 3 , isso funciona muito bem

<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>
user2197018
fonte
não funciona bem com um botão redondo font incrível ícone dentro
Toolkit
O uso de class = 'btn btn-default' corresponde aos outros botões (MVC6).
crokusek
12

Não.

A solução a seguir depende do JavaScript.

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

Se o botão deve ser colocado dentro de um já existente <form>com method="post", em seguida, garantir o botão tem o atributo type="button"de outra forma o botão apresentará a operação POST. Dessa forma, você pode ter um <form>que contenha uma mistura de botões de operação GET e POST.

Peter Wilson
fonte
O onclick não funcionará no protocolo de arquivos, portanto, não é útil para apresentações estáticas, por exemplo. neste caso, a ação propety é o caminho a percorrer.
netalex
1
Se o botão está ligado a uma página, então não é um botão, é uma âncora
Capsule
@ Cápsula é tão comum ver esses dias. Basta olhar para a página de destino de todas as estruturas de desenvolvimento web existentes. Eu sou a favor do argumento purista normalmente, mas até eu tenho que admitir que um botão retangular grande tem uma disponibilidade melhor e mais óbvia do que um link, mesmo que ele vincule a uma página em vez de iniciar uma ação de forma verdadeira.
TheDudeAbides
No momento, tenho um backup <a>interno <button>(com o mesmo href) um backup se o JS estiver desativado e, daqui a seis meses, ficarei com vergonha de admitir isso.
TheDudeAbides
@TheDudeAbides Não estou falando sobre o aspecto, mas sobre a marcação que você deseja usar. O que impede você de denominar esse link como um grande botão retangular? A menos que seu site não use nenhum estilo? Entre a resposta acima da que estamos comentando, é um exemplo perfeito disso. É uma tag de âncora, estilizada como um botão.
Cápsula
10

Acabei de pular para o mesmo problema e resolvi substituindo a tag 'button' por 'span'. No meu caso, estou usando o bootstrap. É assim que parece:

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 
gobeltri
fonte
4
Você não precisa da extensão com o bootstrap. Basta mover a parte inteira da classe para <a> e você terá um botão de link. por exemplo, <a href="#register" class="btn btn-default btn-lg"> Inscreva-se </a>
Ryan Buddicom
O pôster original pergunta se é possível colocar um botão dentro de uma etiqueta de âncora. A resposta aceita observa que é contrário às especificações do W3C colocar um <a> dentro de um <a>. Eu acho que é por isso que golbeltri estava demonstrando o estilo de um <span> como um botão.
StackOverflowUser
Isso faz sentido se houver outro conteúdo dentro do <a>, que faz parte do link, mas não tenha o estilo de um botão. Por exemplo, qualquer clique em um div(imagem, plano de fundo, texto etc.) vai para um link, mas apenas se spanparece com um botão.
Josiah
7

Seria muito estranho se isso fosse válido e eu esperaria que fosse inválido. O que significa ter um elemento clicável dentro de outro elemento clicável? Qual é - um botão ou um link?

Steve Jorgensen
fonte
Obrigado Steve. Este foi um método sugerido para mim por um trabalhador de equipe. O método funciona. Existe alguma maneira melhor de fazer isso?
1877 Marie
1
@ Marie Se você quiser fazer com que um link pareça um botão, é fácil usar estilos CSS para torná-lo como tal. Adicionar um estilo de borda semelhante a este: border: 2px outset. Se você quiser arredondar um pouco as esquinas, também poderá usar um raio de borda . Uma <img>tag simples também funcionaria bem.
Código inútil
3

Outra opção é usar o atributo onclick do botão:

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

Isso funciona, no entanto, o usuário não verá o link exibido em foco, como faria se estivesse dentro do elemento.

LaserCat
fonte
2

Atualmente, mesmo que a especificação não permita, "parece" ainda funcionar para incorporar o botão em uma <a href...><button ...></a>tag, FWIW ...

rogerdpack
fonte
2
Isso funciona quando o <button>não está contido em a <form>. No entanto, assim que o botão está contido (por exemplo, <form>...<a><button>) , ele pára de funcionar, a menos que alguém desative o manipulador ao clicar no botão. São giros suficientes para evitar esse cenário.
bispo
0

Você pode adicionar uma classe ao botão e colocar algum script para redirecioná-lo.

Eu faço assim:

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

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

por que não ... você também pode incorporar a imagem no botão

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 
Tapasit Suesasiton
fonte
2
O problema é que <a> </a>, como o OP pediu na época, é um pouco restritivo no que permite estar dentro de seus limites. Veja a pergunta aceita lá.
Thomas
-1

É ilegal no HTML5 incorporar um elemento de botão dentro de um link.

Melhor usar CSS no padrão e: estados ativo (pressionado):

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>

Patanjali
fonte
-2

Eu tento suas soluções javascript, mas, para o trabalho, preciso inserir a e.preventDefault();função javascript na minha.

<!-- 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>   
Paolo Ferraris
fonte
-3

Use o atributo de formação dentro do botão

PS! Funciona apenas se o seu botão digitar = "enviar"

<button type="submit" formaction="www.youraddress.com">Submit</button>
Moonfly
fonte
você também precisa colocar o botão em uma tag <form>.
Denodster 24/05
-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
Ou você pode usar o script java no botão como:

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

aditya panchal
fonte
Apenas torne-se alguns navegadores permitirão, não significa que é uma boa ideia.
Denodster # 24/16