• Dom中的一些接口


        节点都是单个对象,有时需要一种数据结构,能够容纳多个节点。DOM 提供两种节点集合,用于容纳多个节点:NodeList和HTMLCollection。这两种集合都属于接口规范。许多 DOM 属性和方法,返回的结果是NodeList实例或HTMLCollection实例。主要区别是,NodeList可以包含各种类型的节点,HTMLCollection只能包含 HTML 元素节点。

    NodeList 接口

    NodeList实例是一个类似数组的对象,它的成员是节点对象。通过以下方法可以得到NodeList实例。

    Node.childNodes

    document.querySelectorAll()等节点搜索方法

    document.body.childNodes instanceof NodeList // true

         NodeList实例很像数组,可以使用length属性和forEach方法。但是,它不是数组,不能使用pop或push之类数组特有的方法。但是具有length属性和forEach方法。除了使用forEach方法遍历 NodeList 实例,还可以使用for循环。

    var children = document.body.childNodes;
    
    for (var i = 0; i < children.length; i++) {
    
      var item = children[i];
    
    }

    NodeList.prototype.length

    length属性返回 NodeList 实例包含的节点数量。

    document.querySelectorAll('xxx').length

    // 0

    NodeList.prototype.forEach()

    forEach方法用于遍历 NodeList 的所有成员。它接受一个回调函数作为参数,每一轮遍历就执行一次这个回调函数,用法与数组实例的forEach方法完全一致。

    var children = document.body.childNodes;
    
    children.forEach(function f(item, i, list) {
    
      // ...
    
    }, this);

    NodeList.prototype.item()

    item方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。

    document.body.childNodes.item(0)

    上面代码中,item(0)返回第一个成员。

    如果参数值大于实际长度,或者索引不合法(比如负数),item方法返回null。如果省略参数,item方法会报错。

    所有类似数组的对象,都可以使用方括号运算符取出成员。一般情况下,都是使用方括号运算符,而不使用item方法。

    document.body.childNodes[0]

    NodeList.prototype.keys(),NodeList.prototype.values(),NodeList.prototype.entries()

    这三个方法都返回一个 ES6 的遍历器对象,可以通过for...of循环遍历获取每一个成员的信息。区别在于,keys()返回键名的遍历器,values()返回键值的遍历器,entries()返回的遍历器同时包含键名和键值的信息。

    var children = document.body.childNodes;
    
    for (var key of children.keys()) {
    
      console.log(key);
    
    }
    
    // 0
    
    // 1
    
    // 2
    
    // ...
    
    for (var value of children.values()) {
    
      console.log(value);
    
    }
    
    // #text
    
    // <script>
    
    // ...
    
    for (var entry of children.entries()) {
    
      console.log(entry);
    
    }
    
    // Array [ 0, #text ]
    
    // Array [ 1, <script> ]
    
    // ...

    HTMLCollection 接口

    HTMLCollection是一个节点对象的集合,只能包含元素节点(element),不能包含其他类型的节点。它的返回值是一个类似数组的对象,但是与NodeList接口不同,HTMLCollection没有forEach方法,只能使用for循环遍历。HTMLCollection实例都是动态集合,节点的变化会实时反映在集合中。

    HTMLCollection.prototype.length

    length属性返回HTMLCollection实例包含的成员数量。

    document.links.length // 18

    HTMLCollection.prototype.item()

    item方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。

    var c = document.images;
    
    var img0 = c.item(0);

    上面代码中,item(0)表示返回0号位置的成员。由于方括号运算符也具有同样作用,而且使用更方便,所以一般情况下,总是使用方括号运算符。

    如果参数值超出成员数量或者不合法(比如小于0),那么item方法返回null。

    HTMLCollection.prototype.namedItem()

    namedItem方法的参数是一个字符串,表示id属性或name属性的值,返回对应的元素节点。如果没有对应的节点,则返回null。

    // <img id="pic" src="http://example.com/foo.jpg">
    
    var pic = document.getElementById('pic');
    
    document.images.namedItem('pic') === pic // true

    ParentNode 接口

    如果当前节点是父节点,就会混入了(mixin)ParentNode接口。由于只有元素节点(element)、文档节点(document)和文档片段节点(documentFragment)拥有子节点,因此只有这三类节点会拥有ParentNode接口。

    ParentNode.children

    children属性返回一个HTMLCollection实例,成员是当前节点的所有元素子节点。该属性只读。

    下面是遍历某个节点的所有元素子节点的示例。

    for (var i = 0; i < el.children.length; i++) {

      // ...

    }

    ParentNode.firstElementChild

    firstElementChild属性返回当前节点的第一个元素子节点。如果没有任何元素子节点,则返回null。

    document.firstElementChild.nodeName

    // "HTML"

    上面代码中,document节点的第一个元素子节点是<HTML>。

    ParentNode.lastElementChild

    lastElementChild属性返回当前节点的最后一个元素子节点,如果不存在任何元素子节点,则返回null。

    document.lastElementChild.nodeName

    // "HTML"

    上面代码中,document节点的最后一个元素子节点是<HTML>(因为document只包含这一个元素子节点)。

    ParentNode.childElementCount

    childElementCount属性返回一个整数,表示当前节点的所有元素子节点的数目。如果不包含任何元素子节点,则返回0。

    document.body.childElementCount // 13

    ParentNode.append(),ParentNode.prepend()

    append方法为当前节点追加一个或多个子节点,位置是最后一个元素子节点的后面。

    该方法不仅可以添加元素子节点,还可以添加文本子节点。

    var parent = document.body;

    // 添加元素子节点

    var p = document.createElement('p');

    parent.append(p);

    // 添加文本子节点

    parent.append('Hello');

    // 添加多个元素子节点

    var p1 = document.createElement('p');

    var p2 = document.createElement('p');

    parent.append(p1, p2);

    ChildNode 接口

    如果一个节点有父节点,那么该节点就拥有了ChildNode接口。

    ChildNode.remove()

    remove方法用于从父节点移除当前节点。

    el.remove()

    上面代码在 DOM 里面移除了el节点。

    ChildNode.before(),ChildNode.after()

    before方法用于在当前节点的前面,插入一个或多个同级节点。两者拥有相同的父节点。

    注意,该方法不仅可以插入元素节点,还可以插入文本节点。

    var p = document.createElement('p');

    var p1 = document.createElement('p');

    // 插入元素节点

    el.before(p);

    // 插入文本节点

    el.before('Hello');

    // 插入多个元素节点

    el.before(p, p1);

    // 插入元素节点和文本节点

    el.before(p, 'Hello');

    after方法用于在当前节点的后面,插入一个或多个同级节点,两者拥有相同的父节点。用法与before方法完全相同。

    ChildNode.replaceWith()

    replaceWith方法使用参数节点,替换当前节点。参数可以是元素节点,也可以是文本节点。

    var span = document.createElement('span');

    el.replaceWith(span);

    上面代码中,el节点将被span节点替换。

  • 相关阅读:
    SSH 密钥类型的的选择
    VMware 默认的虚拟交换机关系与VMnet设置
    路由器端口映射不生效的解决方法
    优先使用对象组合,而不是类继承
    权限管理系统之软件注册模块
    如何正确安装phpDocumentor
    IE下cookie跨域问题
    Linux下Apache无法解析.php文件
    用 memcache 来存储 session
    windows7 下 phpunit 安装
  • 原文地址:https://www.cnblogs.com/hjy-21/p/12327558.html
Copyright © 2020-2023  润新知