¿Puedo anidar un elemento <button> dentro de un <a> usando HTML5?

145

Estoy haciendo lo siguiente:

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

Esto funciona bien, pero recibo un error de validación HTML5 que dice "El elemento 'botón' no debe estar anidado dentro del elemento 'un botón'.

¿Alguien puede darme consejos sobre lo que debo hacer?

Marie
fuente
8
El validador ya respondió su pregunta por usted e incluso le dijo por qué no es válida en ese mensaje de error.
Código inútil
1
Pero, ¿hay alguna alternativa si quiero que Google pueda ver eso como un enlace? Como ejemplo de uso de botones, tengo botones llamados "<<" y ">>" para el siguiente registro y el registro anterior. Creo que estos deberían ser botones, pero la funcionalidad es que enlazan con páginas nuevas.
Marie
3
mi pregunta es ¿Importa ... si haces esta excepción bien merecida?
Muhammad Umer
1
Si pongo <button> <a href="dsada.html"> Test </a> </button> no funciona en Internet Explorer 11 o Firefox.
dutraveller

Respuestas:

231

No , no es HTML5 válido según el documento de especificaciones HTML5 de W3C :

Modelo de contenido: transparente , pero no debe haber contenido interactivo descendiente de .

El elemento a puede estar envuelto alrededor de párrafos enteros, listas, tablas, etc., incluso secciones enteras, siempre que no haya contenido interactivo (por ejemplo, botones u otros enlaces).

En otras palabras, puede anidar cualquier elemento dentro de un <a>excepto los siguientes:

  • <a>

  • <audio>(si el atributo de controles está presente)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(si el atributo usemap está presente)

  • <input>(si el atributo type no está en estado oculto )

  • <keygen>

  • <label>

  • <menu>(si el atributo type está en el estado de la barra de herramientas )

  • <object>(si el atributo usemap está presente)

  • <select>

  • <textarea>

  • <video>(si el atributo de controles está presente)


Si está intentando tener un botón que se vincule a algún lugar, envuelva ese botón dentro de una <form>etiqueta como tal:

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

Sin embargo, si su <button>etiqueta está diseñada con CSS y no se parece al widget del sistema ... Hágase un favor, cree una nueva clase para su <a>etiqueta y póngale el mismo estilo.

Andrew Moore
fuente
1
@Andrew Moore - ¿Hay alguna otra manera? Creo que esto dio problemas y por eso se cambió para estar dentro de un enlace <a>. No estoy seguro de cuál era el problema, pero tenemos muchos de estos botones como este en una página. Tal vez fue porque queríamos mejorar el SEO mediante el uso de enlaces <a>.
Marie
2
@Marie: No hay otra forma que no sea diseñar tus enlaces para que se vean como botones.
Andrew Moore
3
user25 no es no es mejor usar method = "post" porque el navegador solicita reenviar un formulario de publicación al navegar de un lado a otro. Como GET es el método predeterminado de un formulario, uno puede dejar method = "get" por brevedad.
Bijan
44
@AndrewMoore: diseñar un enlace para que parezca un botón crea su propio conjunto de problemas, como la accesibilidad. Un botón debe ejecutarse cuando tiene el foco y presionas la barra espaciadora. Un enlace no. Si le preocupa la ADA (o se le exige que finja que le importa), esto puede morderlo.
iconoclasta
2
Como sugirió @jonaspas, un <div>an dentro <a>es absolutamente válido en HTML5: validator.w3.org/nu/…
Socob
43

Si estás usando Bootstrap 3 , esto funciona bastante bien

<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>
usuario2197018
fuente
no funciona bien con un icono impresionante de fuente de botón redondo dentro
Toolkit
El uso de class = 'btn btn-default' coincidió con los otros botones (MVC6).
crokusek
12

No.

La siguiente solución se basa en JavaScript.

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

Si el botón es para ser colocado dentro de una existente <form>con method="post", a continuación, asegurar el botón tiene el atributo type="button"de lo contrario el botón someterá la operación POST. De esta manera, puede tener un <form>que contiene una mezcla de botones de operación GET y POST.

Peter Wilson
fuente
onclick no funcionará en el protocolo de archivo, por lo que no es útil para presentaciones estáticas, por ejemplo. en este caso, la propiedad de acción de forma es el camino a seguir.
netalex
1
Si el botón está vinculado a una página, entonces no es un botón, es un ancla
Cápsula
@Capsule es muy común ver estos días. Solo mire la página de inicio para cada marco de desarrollo web que exista. Por lo general, estoy a favor del argumento purista, pero incluso tengo que admitir que un gran botón rectangular tiene una capacidad mejor y más obvia que un enlace, incluso si se vincula a una página en lugar de iniciar una verdadera acción de formulario.
TheDudeAbides
En este momento tengo una <a>dentro de la <button>(con el mismo href) como un respaldo si JS está desactivado, y seis meses a partir de ahora definitivamente voy a estar avergonzado de que admití eso.
TheDudeAbides
@TheDudeAbides No estoy hablando del aspecto, estoy tomando el marcado que quieres usar. ¿Qué le impide diseñar este enlace como un gran botón rectangular? ¿A menos que su sitio no use ningún estilo? Por cierto, la respuesta anterior a la que estamos comentando es un ejemplo perfecto de ello. Es una etiqueta de anclaje, diseñada como un botón.
Cápsula
10

Acabo de saltar al mismo problema y lo resolví sustituyendo la etiqueta 'botón' por la etiqueta 'span'. En mi caso estoy usando bootstrap. Así es como esto luce:

<a href="#register"> 
    <span class="btn btn-default btn-lg">
        Subscribe
    </span>
</a> 
gobeltri
fuente
44
No necesitas el lapso en absoluto con bootstrap. Simplemente mueva toda la parte de la clase a <a> y tendrá un botón de enlace. por ejemplo, <a href="#register" class="btn btn-default btn-lg"> Suscríbete </a>
Ryan Buddicom
El póster original preguntaba si es posible colocar un botón dentro de una etiqueta de anclaje. La respuesta aceptada señala que va en contra de las especificaciones del W3C colocar un <a> dentro de un <a>. Creo que es por eso que golbeltri estaba demostrando el estilo de un <span> como botón.
StackOverflowUser
Esto tiene sentido si hay otro contenido dentro del <a>, que es parte del enlace, pero no tiene el estilo de un botón. Por ejemplo, cualquier clic dentro de un div(imagen, fondo, texto, etc.) va a un enlace, pero solo spanparece un botón.
Josiah
7

Sería realmente extraño si eso fuera válido, y esperaría que no sea válido. ¿Qué debería significar tener un elemento cliqueable dentro de otro elemento cliqueable? ¿Cuál es: un botón o un enlace?

Steve Jorgensen
fuente
Gracias Steve Este fue un método sugerido por un trabajador de equipo. El método funciona. ¿Hay alguna forma mejor de hacer esto?
Marie
1
@Marie Si desea que un enlace se vea como un botón, es fácil usar estilos CSS para que se vea como tal. Añadir un estilo de borde similar a esto: border: 2px outset. Si desea redondear un poco las esquinas, también podría usar un radio de borde . Una <img>etiqueta simple también funcionaría bien.
Código inútil
3

Otra opción es usar el atributo onclick del botón:

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

Esto funciona, sin embargo, el usuario no verá el enlace que se muestra al pasar el mouse como si estuviera dentro del elemento.

LaserCat
fuente
2

En estos días, incluso si la especificación no lo permite, "parece" que todavía funciona para incrustar el botón dentro de una <a href...><button ...></a>etiqueta, FWIW ...

rogerdpack
fuente
2
Esto funciona cuando el <button>no está contenido dentro de a <form>. Sin embargo, tan pronto como se contiene el botón (por ejemplo <form>...<a><button>) , esto deja de funcionar, a menos que uno desactive el controlador de clic del botón. Esto es suficiente para evitar evitar este escenario.
obispo
0

Puede agregar una clase al botón y colocar un script que lo redirija.

Lo hago de esta manera:

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

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

por qué no ... también puedes incrustar la imagen en el botón

<FORM method = "POST" action = "https://stackoverflow.com"> 
    <button type="submit" name="Submit">
        <img src="img/Att_hack.png" alt="Text">
    </button>
</FORM> 
Tapasit Suesasiton
fuente
2
El problema es que <a> </a>, como preguntó el OP en ese entonces, es un poco restrictivo en lo que permite estar dentro de sus límites. Vea la pregunta aceptada allí.
Thomas
-1

Es ilegal en HTML5 incrustar un elemento de botón dentro de un enlace.

Es mejor usar CSS en el estado predeterminado y: estados activos (presionados):

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
fuente
-2

Pruebo sus soluciones de JavaScript pero, para el trabajo, necesito insertarlas e.preventDefault();en mi función de 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>   
Paolo Ferraris
fuente
-3

Use el atributo de formación dentro del botón

¡PD! Solo funciona si su botón type = "submit"

<button type="submit" formaction="www.youraddress.com">Submit</button>
Moonfly
fuente
También debe colocar el botón en una etiqueta <form>.
denodster
-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
O puede usar el script java en el botón como:

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

aditya panchal
fuente
Solo convertirse en algunos navegadores lo permitirá, no significa que sea una buena idea.
denodster