我可以使用HTML5在<a>内嵌套<button>元素吗?


145

我正在执行以下操作:

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

效果很好,但出现HTML5验证错误,提示“元素'button'不能嵌套在元素'a button'内”。

谁能给我建议我该怎么做?


8
验证器已经为您回答了您的问题,甚至在错误消息中告诉您了为什么它无效的问题。
没用的代码,

1
但是,如果我希望Google能够将其视为链接,是否还有其他选择。作为按钮用法的示例,我有一个名为“ <<”和“ >>”的按钮用于下一个记录和上一个记录。我相信这些应该是按钮,但是功能是它们链接到新页面。
玛丽

3
我的问题是,这是否重要。.如果您做出这一当之无愧的例外。
穆罕默德·乌默尔

1
如果我将<button> <a href="dsada.html">测试</a> </ button>放在Internet Explorer 11或Firefox上不起作用。
dutraveller 2014年

Answers:


231

,根据W3CHTML5规范文档,它不是有效的HTML5 :

内容模型: 透明,但必须没有交互式内容后代。

只要其中没有交互内容(例如按钮或其他链接),该元素就可以包裹在整个段落,列表,表格等,甚至整个节中。

换句话说,可以将<a>除以下内容之外的任何元素嵌套:

  • <a>

  • <audio>(如果存在controls属性)

  • <button>

  • <details>

  • <embed>

  • <iframe>

  • <img>(如果存在usemap属性)

  • <input>(如果type属性未处于隐藏状态)

  • <keygen>

  • <label>

  • <menu>(如果type属性处于工具栏状态)

  • <object>(如果存在usemap属性)

  • <select>

  • <textarea>

  • <video>(如果存在controls属性)


如果您尝试使用一个链接到某处的按钮,请将该按钮包装在<form>标签中,如下所示:

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

但是,如果您的<button>标签是使用CSS设置样式的,并且看起来不像系统的窗口小部件,请帮帮忙<a>


1
@安德鲁·摩尔-还有另一种方式。我相信这会带来问题,这就是为什么将其更改为<a>链接内的原因。不确定问题出在哪里,但是页面上有许多类似这样的按钮。也许是因为我们想通过使用<a>链接来改善SEO。
玛丽

2
@Marie:除了将链接的样式设置为按钮之外,别无他法。
Andrew Moore

3
user25 not不是使用method =“ post”更好的方法,因为浏览器在来回导航时要求重新发送帖子形式。由于GET是表单的默认方法,因此为了简洁起见,可以省略method =“ get”。
Bijan 2015年

4
@AndrewMoore:将链接的样式设置为类似于按钮的样式会产生自己的一系列问题,例如可访问性。当按钮具有焦点并按下空格键时,应执行该按钮。链接没有。如果您在乎ADA(或要求假装在乎),那么这可能会咬您。
iconoclast

2
正如@jonaspas所建议的那样,一个<div>内部元素<a>在HTML5中绝对有效:validator.w3.org/nu/…–
Socob

43

如果您使用的是Bootstrap 3,则效果很好

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

里面的圆形按钮真棒图标效果不佳
Toolkit

使用class ='btn btn-default'匹配其他按钮(MVC6)。
crokusek '16

12

没有。

以下解决方案依赖JavaScript。

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

如果要将按钮放置在现有的<form>method="post",请确保按钮具有属性,type="button"否则按钮将提交POST操作。这样,您就可以拥有<form>混合了GET和POST操作按钮的。


onclick不适用于文件协议,因此,例如,它对于静态演示没有用。在这种情况下,采取行动行动是必经之路。
netalex

1
如果该按钮链接到页面,则它不是按钮,而是锚点
Capsule

@胶囊很常见,这些天。只需查看现有的每个Web开发框架的登录页面即可。通常,我只接受纯粹主义者的论据,但是即使我不得不承认,一个大的矩形按钮比链接具有更好,更明显的承受能力,即使它链接到页面而不是启动真正的表单动作也是如此。
TheDudeAbides

现在,如果禁用了JS,我将在<a>内部拥有一个<button>(具有相同的href)作为备份,并且从现在开始的六个月后,我肯定会为此而感到尴尬。
TheDudeAbides

@TheDudeAbides我不是在谈论它的方面,我是在谈论您要使用的标记。是什么使您无法将此链接设置为大的矩形按钮的样式?除非您的网站根本不使用任何样式?顺便说一句,我们正在评论的答案就是一个很好的例子。这是一个锚标记,样式为按钮。
胶囊

10

我刚刚遇到了同样的问题,并通过将“ button”标签替换为“ span”标签来解决。就我而言,我正在使用引导程序。它是这样的:

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

4
使用引导程序根本不需要跨度。只需将整个类的部分移到<a>,您将有一个链接按钮。例如<a href="#register" class="btn btn-default btn-lg">订阅</a>
Ryan Buddicom 2014年

原始海报询问是否可以锚标签放置一个按钮。接受的答案指出,在<a>中放置<a>违反W3C规范。我认为这就是golbeltri演示将<span>设置为按钮的原因。
StackOverflowUser 2015年

如果链接中有其他内容<a>,但该内容不是链接的样式,这是有意义的。例如,div(图像,背景,文本等)内的任何单击都会转到链接,但仅span外观类似于按钮。
乔西亚2015年

7

如果那是有效的,那将真的很奇怪,我希望它是无效的。在另一个可点击元素中包含一个可点击元素意味着什么?它是-按钮还是链接?


谢谢史蒂夫。这是团队工作人员向我建议的一种方法。该方法确实有效。有什么更好的方法可以做到这一点吗?
玛丽

1
@Marie如果您想使链接看起来像一个按钮,则很容易使用CSS样式使它看起来像这样。添加类似于以下内容的边框样式:border: 2px outset。如果您想稍微拐角,也可以在其上使用边框半径。一个简单的<img>标签也可以很好地工作。
没用的代码,

3

另一个选择是使用按钮的onclick属性:

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

此方法有效,但是,用户将不会看到悬停时显示的链接,就像链接在元素内一样。


2

如今,即使规范不允许这样做,“似乎”仍然可以将按钮嵌入<a href...><button ...></a>标签FWIW中……


2
<button>不在内时,此方法有效<form>。但是,一旦包含按钮(例如<form>...<a><button>),它将停止工作,除非禁用按钮的单击处理程序。这样的回转足以确保避免这种情况。
主教

0

您可以将一个类添加到按钮,并添加一些脚本来重定向它。

我这样做:

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

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

0

为什么不..您也可以在按钮上嵌入图片

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

2
问题在于,OP当时要求的<a> </a>对其范围内的限制有些限制。在此处查看已接受的问题。
托马斯


-1

在HTML5中将按钮元素嵌入链接是非法的。

最好在默认和:active(按下)状态下使用CSS:

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

我尝试使用您的javascript解决方案,但为了工作,我需要e.preventDefault();在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

在按钮内使用formaction属性

PS!仅当您的按钮type =“ submit”时有效

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

您还需要将按钮放在<form>标记中。
denodster '16

-3

<a href="index.html">
  <button type="button">Submit</button>
</a>
或者,您可以将按钮中的Java脚本用作:

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


只是成为一些浏览器会允许的,并不意味着它是一个好主意。
denodster '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.