39

我刚刚注意到,在 soundcloud 中,轨道上的“动作”按钮(如转发等)都是 html 按钮标签。此外,它们既不在表单内部,也不绑定到 la html5 的表单,也不提交表单(它们显然是通过 javascript 处理的)。这是有效的 HTML 吗?没有表单可以存在按钮吗?或者这只是使这些按钮成为可点击的 div 吗?对于屏幕阅读器来说,这有多有效/无效?

4

2 回答 2

59

button元素在文档正文中可能出现文本级标记的任何地方都有效。这样的元素不需要与元素有任何关系form。目前权威的参考是HTML 4.01 规范,正式的规则在 DTD 中,但是你可以走捷径,使用W3C Markup Validator来检查一个文档是否有效。

当不与表单关联时,button元素与元素没有太大区别span(而不是div,默认情况下是块级的),但button具有特殊的默认呈现。浏览器和辅助软件也可能被视为button特殊的,并且button仅将其用于应该在单击时触发某些操作的元素是最安全的。相反,这些元素通常最好使用button标记来表示,尽管您也可以通过其他方式(主要是图像或 CSS)创建视觉上类似按钮的元素。

在表单之外,button元素具有type=button默认值(这通常是唯一明智type的)。这意味着它只能通过 JavaScript 发挥作用。这不会以任何方式使其无效。但是,您可以考虑通过 JavaScript 生成此类按钮,而不是将它们作为静态 HTML 内容,这样当脚本被禁用时,就不会有(有效但)令人困惑的按钮什么都不做。

为了解决以下评论中的澄清问题:

一个button type=button元素类似于input type=button; 区别在于后者没有内容,而是从value属性中获取按钮中显示的文本,而button具有可以“丰富”(带有标记)的内容。

对于任一元素,如果使用它们会导致服务器操作(通常通过 Ajax 调用),那么我们确实可以询问页面在禁用 JavaScript 的情况下如何工作。但是这个问题可能无关紧要(也许页面是一个无论如何都应该使用 JavaScript 运行的应用程序),并且无论如何这个想法在形式上没有任何问题。

它们为什么存在?为了作者的方便和遗留的原因,我会说。类似地,有人可能会问为什么 HTML 有事件属性,如果没有客户端脚本,它们就无法工作,而您可以将事件处理程序分配给 JavaScript 中的元素。但在早期,这是不可能的,即使在现在,使用button元素或onclick属性可能比在 JavaScript 中做事更方便(并且,为了使元素看起来像一个按钮,CSS)。还有一点是buttoninput type=button为元素创建依赖于浏览器的外观,并且可能会争辩说,对于大多数用户来说,任何具有浏览器默认按钮样式的样式都被视为按钮。

于 2013-01-22T15:44:54.943 回答
6

是的。很久以来。

来自whatwg.org

可以使用此元素的上下文:

预期措辞内容的地方。

在 ajax 时代,大多数输入不仅仅是通过提交表单来发送的。大多数按钮仅用于在使用可识别的小部件时执行单击操作。

于 2013-01-22T15:07:20.897 回答