【发布时间】:2015-06-16 14:17:52
【问题描述】:
在 HTML 中,当解析 table 元素内部带有 tr 元素时,通常会插入 tbody:
function log(el, ctx) {
var li = document.createElement('li');
li.appendChild(document.createTextNode(el.tagName.toLowerCase()));
var ul = document.createElement('ul');
for(var i=0; i<el.children.length; ++i)
log(el.children[i], ul);
li.appendChild(ul);
ctx.appendChild(li);
}
log(document.querySelector('table'), document.getElementById('dom-tree'));
table {
display: none;
}
<table>
<tr><td>1</td></tr>
<tr><td>2</td></tr>
</table>
The table is parsed as:
<ul id="dom-tree"></ul>
这是行为标准吗?
我在the spec 中找不到它的描述,但它是有道理的,因为insertRow DOM 方法也会自动创建tbody 元素:
tr = 表格。
insertRow( [ index ] )创建一个
tr元素,以及一个tbody(如果需要),插入它们 在参数给定的位置进入表中,并返回tr.
【问题讨论】:
-
tbody是标准 HTML 定义的一部分(请参阅您为规范提供的链接中的第 4.9.5 节),但不需要使用它。这样渲染引擎就可以区分标题和正文(参见<thead>)。 -
@lurker 是的,我知道
tbody不是必需的(table的内容模型允许tr没有tbody)。但是,如果您不包含它,大多数浏览器都会插入它。我可以依赖它吗? -
@lurker 您应该将其发布为答案
-
@lurker 我已经包含了一个 sn-p,它表明当表被解析到 DOM 时,
tbody是字面上插入的。这发生在 Firefox、Chrome 和 IE8 上。 -
啊,谢谢你的sn-p。我明白你的意思了。对我来说,除非它更改您的 HTML 文件,否则它不是字面意思。除此之外,它仍然是“内部”渲染。 ;) 语义差异... :)
标签: html html-parsing html-table language-lawyer