我需要做的不仅仅是像Yi Jiang和mu is too short所给出的DTD一样进行检查,这比较复杂。
的确,XHTML 1.0 DTD明确禁止在您的问题中给出的情况下,将<a>
元素作为<button>
元素的子元素。然而,它并没有禁止<a>
元素作为<button>
元素的后代。
因此
<button>
normal text
<b>bold text</b>
<span><a href="http://www.example.com/">linked text</a></span>
</button>
这是XHTML 1.0 Strict DTD符合标准的。但它与问题中的按钮片段一样,在Firefox和Chrome之间存在行为差异。
现在,已知DTD在描述后代关系限制方面存在问题,因此上述示例符合DTD可能并不令人惊讶。
然而,XHTML 1.0规范的附录B除了DTD外还规范了后代限制。它说:
以下元素对它们可以包含哪些元素有禁止规定(请参阅SGML Exclusions)。该禁令适用于所有嵌套深度,即它包含所有后代元素。
button
不能包含input、select、textarea、label、button、form、fieldset、iframe或isindex元素。
请注意,它没有排除<a>
元素。因此,似乎XHTML 1.0不禁止<a>
元素成为<button>
的非子后代,这种情况下的行为确实未定义。
这个遗漏几乎肯定是一个错误。在附录B中,<a>
元素应该被列入禁止作为button后代的元素列表中。
HTML5(包括XHTML5)在这方面更加彻底。它说:
4.10.8 按钮元素
内容模型:
构成语段的内容,但不能有交互式内容后代。
其中交互式内容被定义为
交互式内容是专门用于用户交互的内容。
以下元素属于交互式内容:
-
a
-
audio
(如果存在
controls
属性)
-
button
-
details
-
embed
-
iframe
-
img
(如果存在
usemap
属性)
-
input
(如果
type
属性不处于隐藏状态)
-
keygen
-
label
-
menu
(如果
type
属性处于工具栏状态)
-
object
(如果存在
usemap
属性)
-
select
-
textarea
-
video
(如果存在
controls
属性)
因此,在(X)HTML5中,
<a>
元素被禁止作为
<button>
元素的后代。
<A>
元素是锚点元素的事实,因此可以用于书签文档的一部分。因此,它不应被视为<BUTTON>
元素的无效后代。也许这表明<A>
元素被过度使用而不是你的推理有问题(我同意你的推理)。 - Dancrumb<button>
的非子级<a>
后代的原因,为什么直接子级会被禁止呢?考虑到在HTML4中任何元素都可以作为锚点的目标,以及需要将锚点目标放置在按钮内的用例非常薄弱,我怀疑这不足以证明允许这种情况的正当性。 - Alohcia
元素创建命名锚点已经过时了(顺便说一下,WHATWG最近才将其称为这样的子元素,之前他们称之为滚动发布结构)。 - Marcel Korpel