(X)HTML中未定义的行为?

25 html xhtml undefined-behavior

我知道这个问题几乎要求downvotes,但......

在(X)HTML中是否存在未定义的行为?

在使用<button>标签后,我想知道这一点,它允许HTML呈现为按钮.到目前为止没有新的东西......

但我注意到也可以使用<a>标签.完整的例子:

<button>
    normal text
    <b>bold text</b>
    <a href="http://www.example.com/">linked text</a>
</button>
Run Code Online (Sandbox Code Playgroud)

这在Firefox上呈现如下:http:
//img6.imagebanana.com/img/aq10duov/Selection_005.png

在谷歌浏览器中:http:
//img6.imagebanana.com/img/vdlak82n/Selection_008.png

现在,在Firefox上,链接目标是不可点击的,只有按钮...但是,在Chrome上,链接是可点击的,并将重定向到IANA RFC2606页面.

这是未定义的行为吗?(X)HTML中是否有更多可以描述为未定义行为的情况?

Alo*_*hci 25

这不仅仅是检查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>
Run Code Online (Sandbox Code Playgroud)

是XHTML 1.0严格的DTD符合.但它在Firefox和Chrome之间的行为差​​异与问题中的按钮片段相同.

现在,众所周知,DTD在描述后代关系的限制方面存在问题,因此上述样本符合DTD可能并不奇怪.

然而.XHTML 1.0规范的附录B规范性地描述了除DTD之外的后代限制.它说:

以下元素禁止它们包含哪些元素(参见SGML排除).这种禁止适用于所有嵌套深度,即它包含所有后代元素.

按钮
不得包含输入,选择,文本区域,标签,按钮,窗体,字段集,iframe或isindex元素.

请注意,它包含在排除<a>元素.因此,似乎XHTML 1.0并不禁止该<a>元素成为非子后代,<button>并且在这种情况下的行为确实是未定义的.

这种遗漏几乎肯定是一个错误.该<a>元素应该在附录B中作为按钮后代禁止的元素列表中.

HTML5(包括XHTML5)在这个问题上要彻底得多.它说:

4.10.8按钮元素

内容模型:短语内容,但必须没有互动内容后代.

其中交互式内容被定义为

交互式内容是专门用于用户交互的内容.

  • a
  • audio(如果controls属性存在)
  • button
  • details
  • embed
  • iframe
  • img(如果usemap属性存在)
  • input(如果type属性不在该Hidden状态)
  • keygen
  • label
  • menu(如果type属性处于toolbar状态)
  • object(如果usemap属性存在)
  • select
  • textarea
  • video(如果controls属性存在)

因此,在(X)HTML 5中的<a>元素从作为的后裔禁止的<button>元素.

  • @Yi Jiang.HTML5的命名本身就非常复杂.W3C将其称为"HTML5",WHATWG称之为"生活HTML".它包含一个规范,涵盖HTML序列化(语法)和XHTML序列化,以及许多共同点(例如内容模型).然而,有很多人仍然认为HTML5没有涵盖XHTML,所以我只是用(X)HTML5作为简短的手来说明两个序列化都包含在内. (3认同)
  • 你可能会忽略这样一个事实:`<A>`元素是一个ANCHOR元素,因此可以用来为文档的一部分添加书签.因此,没有理由认为它应该被视为`<BUTTON>`元素的无效后代.也许这表明"<A>"元素的问题超载而不是你的推理错误(对于记录,我同意). (2认同)