javascript - 为什么我的 getElementsByTagName 返回一个空的 NodeList?

标签 javascript

这是我的代码:

<html>

<h1 id="hg">
    <h2>11</h2>
    <h2>22</h2>
    <h2>33</h2>
</h1>

<script>
    var h = document.getElementById("hg").getElementsByTagName("h2");
    alert(h.length);
</script>

</html>

我查了下手册,似乎getElementById在这种情况下返回一个HTMLHeadingElement,它继承了方法getElementsByTagName 元素。我希望得到 3 作为 h.length 的值,但我得到的是 0。有什么问题吗?

最佳答案

你会发现 <h1> 不能包含 another 标题(h1 和其他标题的唯一有效内容是 phrasing content ,它非常简单地将内容限制为内联元素和文本),因此当浏览器构造它移动的 DOM h2 h1外部 元素,这可以防止它们被 DOM 在 h1 中找到.

在 Chrome 中,您的 HTML 被重新组织为以下内容(并且,我推测,在其他浏览器中也进行了类似的重新排列):

<h1 id="hg"></h1>
<h2>11</h2>
<h2>22</h2>
<h2>33</h2>

拯救 DOM 以保持有效性是我们作为开发人员应该始终努力创建有效 HTML 的原因:因为浏览器进行的自动更正是未记录且不可预测的(在 HTML 5 之前,我认为它记录了错误恢复应该如何进行。

顺便说一句,这听起来与为 <hgroup> 提供的用例非常相似元素(似乎正在从规范中删除)。但是,鉴于您似乎正在展示一份内容列表,我建议附上 <h2> <ol> 中的元素并以这种方式对它们进行语义分组:

<ol id="contents">
    <li><h2>11</h2></li>
    <li><h2>22</h2></li>
    <li><h2>33</h2></li>
</ol>

关于javascript - 为什么我的 getElementsByTagName 返回一个空的 NodeList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20163949/

相关文章:

javascript - angularjs - 模型更改时更新表列

javascript - 通过 anchor 隐藏和显示 div 内容

javascript - 表单中的运输详细信息验证

javascript - 使用 Angular JS 和脚本加载器 Modernizr

javascript - 页面刷新后如何选择相同的jquery元素?就像如果我有元素 $ ("td.treeItem"),

javascript - Provider 和 connect 在 React 中如何工作?

javascript - 使用 vanilla JavaScript 将 JSON 数据存储在变量中

javascript - 多次重复jquery函数

javascript - tinymce图片上传php插件什么的

javascript - JQueryUI 进度栏在通过表单提交更新后不保持值