all
You must replace the baseURL in hugo.toml file when deploying, you can manage this announcement from the params.toml file.

DOM-选取元素节点

  • May 17, 2016
内容列表

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,陈养剑 译
comments powered by Disqus

相关

Web 前端跨域访问

为了用户的安全,浏览器通常都会限制跨域(Cross-domain)访问,也就是默认不允许不同域名下页面之间进行资源的传递和信息交互,但很多时候我们又有跨域请求资源的需求。

了解更多

Web 前端性能优化:案例分析 1

能在真实业务场景中落地 Web 性能优化方案的机会鲜有,大多数时候业务是较为简单而且要求不高的,前段时间恰好有一个比较核心的业务,对稳定性和性能有一定的要求,在这个过程中也算是做了很多尝试和实践,在此作为案例记录一下分析的过程和最终解决的方案。

了解更多

文档对象模型(DOM)

在网页设计中,有一个很重要的角色需要我们了解,DOM 帮助我们对页面元素进行增、删、改等全方位的操作,而且让 JavaScript 在客户端修改 HTML 文档成为一个很简单的事情,可以说 DOM 为我们操作 HTML 文档提供了强大的编程接口。

了解更多