2021 版 "Is `<a>` inside of a `<button>` (officially) allowed?" 题

2021 version of the "Is `<a>` inside of a `<button>` (officially) allowed?" question

我不擅长查找和理解官方 w3c 规范,所以请耐心等待。

我只想知道我是否可以在 2021 年正式使用 HTML <button> 元素内的交互式(可点击 href="")锚标记:

<button>
  <a href="https://...">Click Here!</a>
</button>

较早的文章指出只允许短语内容,而根据 MDN,<a> 只有在不包含交互式 [=37] 时才被认为是短语内容=] (href="")。本文包含此类信息:https://css-tricks.com/use-button-element/

MDN states同理,只允许无交互的文字内容。

其他人认为 wrapping the button 在锚标签中是可行的方法(2021 年 8 月 (!))。

据我所知,唯一允许的选项是将按钮包装在一个表单中,如果我想让按钮将用户发送到另一个 URL(除非我想使用JS点击事件):

<form action="https://..." method="GET">
  <button>Click Here!</button>
</form>

有关于此问题的权威来源的提示吗?

在按钮中包裹锚点

您不能在 button 中包含带有 href 的锚点,因为当前 spec 规定了以下内容模型:

Phrasing content, but there must be no interactive content descendant

其中 interactive content 包括 "<a>(如果存在 href 属性)"


将按钮包裹在锚点中

您不能在锚点中包含 button,因为 spec 规定

[...] there must be no interactive content [...]

其中 interactive content 包括 "<button>"


所以我可以确定的剩余选项是:

  • 将您的 button 设置为锚,或将您的锚设置为 button
  • 使用 buttonclick 事件处理程序
  • button 换成 form
  • 随心所欲,希望你需要支持的浏览器足够宽容,可以原谅你的违规行为