DOM-选取元素节点

内容列表

DOM 操作都是通过对文档树中节点的访问来实现的,如何选取特定的元素节点是关键,进而才能访问该元素节点实现修改、查看、移除、替换等操作。

选取特定单一元素节点

取得某一特定单一元素节点的引用最常用的方式如下:

  • querySelector()
  • getElementById()

exp:

<body>
    <ul id="animal">
        <li	id="Dog">Dog</li>
        <li id="Cat">Cat</li>
        <li id="Pig">Pig</li>
    </ul>
</body>
<script>
    // querySecletor()方法可通过多种途径获取第一个<li>
    console.log(document.querySelector("li"));
    console.log(document.querySelector("ul>li"));
    console.log(document.querySelector("#Dog"));
    console.log(document.querySelector("#animal>#Dog"));

    // getElementById()通过ID属性获取
    console.log(document.getElementById("Dog"));
</script>

getElementById() 方法仅能通过节点的 id 属性获取目标节点的引用;而 querySelector() 方法更强大,它可以接受一个 CSS 选择器语法格式(例如 ul > li)的参数,而且它只会返回第一个符合条件的节点的引用。

选取特定元素节点集合

取得某一特定元素节点集合最常用的方式如下:

  • querySelectorAll()
  • getElementsByTagName()
  • getElementsByClassName()
  • getElementsByName()

exp:

<body>
    <ul id="animals">
        <li class="animal">Dog</li>
        <li class="animal">Cat</li>
        <li class="animal">Pig</li>
    </ul>
</body>
<script>
    // querySecletorAll()方法可通过多种途径获取第三个<li>集合
    console.log(document.querySelectorAll("li"));
    console.log(document.querySelectorAll("ul>li"));
    console.log(document.querySelectorAll("#animals>.animal"));

    // getElementsByTagName()通过标签名称获取
    console.log(document.getElementsByTagName("li"));

    // getElementsByClassName()通过class属性获取
    console.log(document.getElementsByClassName("animal"));
</script>

同样地,querySelectorAll() 方法更强大一些,它可以接受一个 CSS 选择器语法格式(例如 ul > li)的参数。getElementsByName() 方法可以通过节点的 name 属性获取特定节点集合的引用,但是它并不常用。

querySelectorAll() 方法获取的节点集合是静态的,也就是说是非实时的,它只是创建该节点集合时文档的快照;而其他的方法获取的节点集合都是实时的,会及时反映文档的当前状态。

选取所有的直属子元素节点

使用元素节点上的 children 属性,我们可以获取该元素节点的所有直属(第一代)子元素节点。

<body>
    <ul>
        <li>Dog</li>
        <li>Cat</li>
        <li>Pig</li>
    </ul>
</body>
<script>
    // 获取<ul>元素内的所有<li>子元素
    console.log(document.querySelector("ul").children);
</script>

获取的该节点集合是实时的,文档中任何改动都将会动态反映到集合中。

选取与上下文有关的元素节点

虽然 querySelector()querySelectorAll()getElementsByTagName()getElementsByClassName() 这些方法一般都通过 document 对象访问,其实在元素节点上也有定义。这样我们可以将这些方法的查找范围缩小到文档树中某一特定分支(或者分支集)。

<body>
    <ul id="fruits">
        <li>Apple</li>
        <li>Banana</li>
        <li>Pear</li>
    </ul>

    <ul id="animals">
        <li>Dog</li>
        <li>Cat</li>
        <li>Pig</li>
    </ul>
</body>
<script>
    // 获取第二个<ul>元素中的所有<li>子元素
    console.log(document.querySelectorAll("#animals>li"));

    // 这样也可以
    var li_animals=document.querySelector("#animals");
    console.log(li_animals.querySelectorAll("li"));
</script>

预定义的元素节点选取

有一些很方便的预定义的元素集合,如下所示:

  • document.all

    获取 HTML 文档中所有元素节点的集合。

  • document.forms

    获取 HTML 文档中所有(from)元素。

  • document.images

    获取 HTML 文档中所有(img)元素。

  • document.links

    获取 HTML 文档中所有(a)元素。

  • document.scripts

    获取 HTML 文档中所有(script)元素。

  • document.styleSheets

    获取 HTML 文档中所有(link、style)元素。

以上类数组列表中,document.all 构建自 HTMLAllCollection;styleSheets 构建自 StyleSheetList;其他的均构建自 HTMLCollection,并且都是实时的。

验证特定元素节点

使用 matchesSelector() 方法,我们可以判断一个元素是否匹配某个选择器字符串。但是该方法在不同内核的浏览器中实现不一样,分别加了前缀:

  • mozMatchesSelector()
  • webkitMatchesSelector()
  • msMatchesSelector()
  • oMatchesSelector()

exp:

<body>
    <ul id="fruits">
        <li>Apple</li>
        <li>Banana</li>
        <li>Pear</li>
    </ul>

    <ul id="animals">
        <li id="Dog">Dog</li>
        <li>Cat</li>
        <li>Pig</li>
    </ul>
</body>
<script>
    // 验证id为Dog的<li>元素是否是第二个<ul>元素的子元素节点
    var a=document.querySelector("#Dog").webkitMatchesSelector("#animals>li");
    console.log(a);
    // 输出true
</script>

结语

querySelector()querySelectorAll() 方法相对来说要功能强大一些,但要特别注意的是后者获取的节点集合不是实时的。

参考

  • 《DOM 启蒙》,Cody Lindley,陈养剑 译

相关

Fastify框架 - 专注于性能和低内存消耗

最近在做 Node.js 技术相关的调研,需要选定一个 Web 框架作为基础来构建业务。一般来说,首选开源方案,对于我来说,比较关注框架背后的开发团队情况、项目活跃度、是否有足够多的商业案例、文档是否完整可读、框架的设计理念、技术架构是否灵活可扩展、技术社区生态是否完整等方面。目前,我比较倾心的是 Fastify 这个新兴框架,根据官网介绍,其专注于高性能和低消耗,并且公开的基准测试表现相当不错,项目足够活跃,更重要的是属于 OpenJS 基金会的孵化项目。本文主要介绍 Fastify 的设计理念和探究其是如何提高性能和降低内存消耗的。

了解更多

HTTP 协议

随着 Internet 的发展,使用 Web 浏览器获取网络数据信息已经成为一种习惯标准,而 HTTP 协议也因此成为了网络体系中最重要的应用层协议。

了解更多

使用 npm

npm 是 Node.js 的一个包管理器,Web 前端工程师也经常利用它来简化开发流程,看看如何愉快的使用 npm ,并且发布自己的包,让 npm 成为我们的开发利器。

了解更多