25 html xhtml undefined-behavior
我知道这个问题几乎要求downvotes,但......
在使用<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
确实,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按钮元素
内容模型:短语内容,但必须没有互动内容后代.
其中交互式内容被定义为
交互式内容是专门用于用户交互的内容.
aaudio(如果controls属性存在)buttondetailsembediframeimg(如果usemap属性存在)input(如果type属性不在该Hidden状态)keygenlabelmenu(如果type属性处于toolbar状态)object(如果usemap属性存在)selecttextareavideo(如果controls属性存在)
因此,在(X)HTML 5中的<a>元素是从作为的后裔禁止的<button>元素.