• Node接口


    原文地址:https://wangdoc.com/javascript/
    所有的DOM节点都继承了Node接口,拥有一些共同的属性和方法。

    属性

    Node.prototype.nodeType

    nodeType属性返回一个整数值,表示节点的类型。

    document.nodeType // 9
    

    Node对象定义了几个常量,对应这些类型值。

    document.nodeType === Node.DOCUMENT_NODE // true
    

    不同节点的nodeType属性值和对应的常量如下。

    • 文档节点(document):9,对应常量Node.DOCUMENT_NODE
    • 元素节点(element):1,对应常量Node.ELEMENT_NODE
    • 属性节点(attr):2,对应常量Node.ATTRIBUTE_NODE
    • 文本节点(text):3,对应常量Node.TEXT_NODE
    • 文档片段节点(DocumentFragment):11,对应常量Node.DOCUMENT_FRAGMENT_NODE
    • 文档类型节点(DocumentType):10,对应常量Node.DOCUMENT_TYPE_NODE
    • 注释节点(Comment):8,对应常量Node.COMMENT_NODE
      确定节点类型时,使用nodeType属性是常用方法。
    var node = document.documentElement.firstChild;
    if (node.nodeType === Node.ELEMENT_NODE) {
        console.log("该节点是元素节点");
    }
    

    Node.prototype.nodeName

    nodeName属性返回节点的名称。

    // HTML 代码如下
    // <div id="d1">hello world</div>
    var div = document.getElementById("d1");
    div.nodeName // "DIV"
    

    不同节点的nodeName属性值如下。

    • 文档节点(document):#document
    • 元素节点(element):大写的标签名
    • 属性节点(attr):属性的名称
    • 文本节点(text):#text
    • 文档片段节点(DocumentFragment):#document-fragment
    • 文档类型节点(DocumentType):文档的类型
    • 注释节点(Comment): #comment

    Node.prototype.nodeValue

    nodeValue属性返回一个字符串,表示当前节点本身的文本值,该属性可写。
    只有文本节点、注释节点和属性节点有文本值,因此这三类节点的nodeValue可以返回结果,其他类型的节点一律返回null。同样的,也只有这三类节点可以设置nodeValue属性的值,其他类型的节点设置无效。

    Node.prototype.textContent

    textContent属性返回当前节点和它所有后代节点的文本内容。

    // <div id="divA">This is <span>some</span> text</div>
    document.getElementById("divA").textContent
    // This is some text
    

    该属性是可读写的,设置该属性的值,会用一个新的文本节点,替换所有原来的子节点。它还有一个好处,就是自动对HTML标签转义。这很适合用于用户提供的内容。

    document.getElementById("foo").textContent = "<p>Goodbye</p>";
    

    上面代码在插入文本时,会将

    标签解释为文本,而不会当做标签处理。
    对于文本节点、注释节点和属性节点,textContent属性值与nodeValue属性相同。对于其他类型的节点,该属性会将每一个子节点(不包括注释节点)的内容连接在一起,如果一个节点都没有,就返回空字符串。
    文档节点和文档类型节点的textContent属性为null,如果要读取整个文档的内容,可以使用document.documentElement.textContent

    Node.prototype.baseURI

    baseURI属性返回一个字符串,表示当前网页的绝对路径。浏览器根据这个属性,计算网页上的相对路径的URL。该属性只读。如果无法读取到网页的URL,baseURI返回null
    该属性的值一般由当前网址的URL(即window.location属性)决定,但是可以使用HTML的标签改变该属性的值。

    Node.prototype.ownerDocument

    ownerDocument属性返回当前节点所在的顶层文档对象,即document对象。document本身的ownerDocument属性返回null

    Node.prototype.nextSibling

    nextSibling属性返回紧跟在当前节点后面的第一个同级节点。如果当前节点后面没有同级节点,则返回null
    注意,该属性还包括文本节点和注释节点()。因此如果当前节点后面有空格,该属性会返回一个文本节点,内容为空格。

    var e1 = document.getElementById("div1").firstChild;
    while (e1 !== null) {
        console.log(e1.nodeName);
        e1 = e1.nextSibling;
    }
    

    上面代码遍历div1节点的所有子节点。

    Node.prototype.previousSibling

    previousSibling属性返回当前节点前面的、距离最近的一个同级节点。如果当前节点前面没有同级节点,则返回null

    Node.prototype.parentNode

    parentNode属性返回当前节点的父节点。对于一个节点来说,它的父节点只能是三种类型:元素节点、文档节点和文档片段节点。
    文档节点和文档片段节点的父节点都是null。另外,对于那些生成后还没有插入DOM树的节点,父节点也是null

    Node.prototype.parentElement

    parentElement属性返回当前节点的父元素节点。如果当前节点没有父节点,或者父节点类型不是元素节点,则返回null
    由于父节点的类型只可能是三种类型:元素节点、文档节点和文档片段节点。parentElement属性相当于把后两种父节点都排除了。

    Node.prototype.firstChild、Node.prototype.lastChild

    firstChild属性返回当前节点的第一个子节点,如果当前节点没有子节点,则返回null
    注意:firstChild返回的除了元素节点,还可能是文本节点或注释节点。
    lastChild返回最后一个子节点,用法和firstChild相同。

    Node.prototype.childNodes

    childNodes返回一个类似数组的对象(NodeList集合),成员包括当前节点的所有子节点。
    注意,除了元素节点,childNodes属性的返回值还包括文本节点和注释节点。如果当前节点不包括任何子节点,则返回一个空的NodeList集合。由于NodeList是一个动态集合,一旦子节点发生变化,立刻会反映在返回结果中。

    Node.prototype.isConnected

    isConnect属性返回一个布尔值,表示当前节点是否在文档之中。

    var test = document.createElement("p");
    test.isConnected // false
    
    document.body.appendChild(test);
    test.isConnected // true
    

    方法

    Node.prototype.appendChild()

    appendChild方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。该方法的返回值就是插入文档的子节点。

    var element = document.createElement("div").appendChild(document.createElement("b"));
    

    上面代码返回值是,而不是


    如果appendChild方法的参数是DocumentFragment节点,那么插入的是DocumentFragment的所有子节点,而不是DocumentFragment节点本身。返回值是一个空的DocumentFragment节点

    Node.prototype.hasChildNodes

    hasChildNodes方法返回一个布尔值,表示当前节点是否有子节点。
    注意,子节点包括所有类型的节点,并不仅仅是元素节点。哪怕节点包含一个空格,hasChildNodes返回也返回true
    判断一个节点有没有子节点有很多种方法,下面是其中三种。

    • node.hasChildNodes()
    • node.firstChild !== null
    • node.childNodes && node.childNodes.length > 0
      hasChildNodes方法结合firstChild属性和nextSibling属性,可以遍历当前节点的所有后代。
    function DOMComb(parent, callback) {
        if (parent.hasChildNodes()) {
            for (var node = parent.firstChild; node; node = node.nextSibling) {
                DOMComb(node, callback);
            }
        }
        callback(parent);
    }
    
    DOMComb(document.body, console.log);
    

    Node.prototype.cloneNode()

    cloneNode方法用于克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点。它的返回值是克隆出来的新节点。
    该方法有一些使用注意点。
    (1)克隆一个节点,会拷贝该节点所有属性,但是会丧失addEventListener方法和on-属性(即node.onclick = fn),添加在这个节点上的事件回调函数。
    (2)该方法返回的节点不在文档之中,即没有任何父节点。
    (3)克隆一个节点之后需要注意id属性和name属性。

    Node.prototype.insertBefore

    insertBefore方法将一个节点插入父节点内部的指定位置。insertBefore方法接受两个参数,第一个参数是所要插入的节点,第二个参数是父节点内部的一个子节点。返回值是插入的新节点。
    如果insertBefore方法的第二个参数为null,则新节点将插在当前节点内部的最后位置,即变成最后一个子节点。

    var p = document.createElement("p");
    document.body.insertBefore(p, document.body.firstChild);
    

    注意:如果所要插入的节点是当前DOM现有节点,则该节点将从原有的位置移除,插入新的位置
    由于不存在insertAfter方法,如果新节点要插在父节点的某个子节点后面,可以用insertBeforenextSibling属性模拟。

    parent.insertBefore(s1, s2.nextSibling);
    

    如果insertBefore方法的参数是DocumentFragment节点,那么插入的是DocumentFragment的所有子节点,而不是DocumentFragment节点本身。返回值是一个空的DocumentFragment节点

    Node.prototype.removeChild()

    removeChild方法接受一个子节点作为参数,用于从当前节点移除该子节点,返回值是移除的子节点。

    var element = document.getElementById("top");
    while (element.firstChild) {
        element.removeChild(element.firstChild);
    }
    

    如果参数节点不是当前节点的子节点,removeChild方法将报错。

    Node.prototype.replaceChild

    replaceChild方法用于将一个新的节点,替换当前的某个子节点。

    var replaceNode = parentNode.replaceChild(newChild, oldChild);
    

    Node.prototype.contains()

    contains方法返回一个布尔值,表示参数节点是否满足一下三个条件之一。

    • 参数节点为当前节点
    • 参数节点为当前节点的子节点
    • 参数节点为当前节点的后代节点

    Node.prototype.compareDocumentPosition()

    compareDocumentPosition方法的用法与contains完全一致,返回一个七个比特位的二进制值,表示参数节点与当前节点的关系。

    二进制值 十进制值 含义
    000000 0 两个节点相同
    000001 1 两个节点不在同一个文档(即有一个节点不在当前文档)
    000010 2 参数节点在当前节点的前面
    000100 4 参数节点在当前节点的后面
    001000 8 参数节点包含当前节点
    010000 16 当前节点包含参数节点
    100000 32 浏览器内部使用
    // HTML 代码如下
    // <div id="mydiv">
    //     <form><input id="test"><input></form>
    // </div>
    
    var div = document.getElementById("mydiv");
    var input = document.getElementById("test");
    
    div.compareDocumentPosition(input) // 20
    input.compareDocumentPosition(div) // 10
    

    上面代码中,节点div包含input(二进制010000),而且节点inputdiv的后面,(二进制000100),所以第一个compareDocumentPosition返回20(二进制010100)。第二个依此类推。

    Node.prototype.isEqualNode(),Node.prototype.isSameNode()

    isEqualNode返回一个布尔值,用于检查两个节点是否相等。所谓相等的节点指的是两个节点类型相同,属性相同,子节点相同。
    isSameNode返回一个布尔值,表示两个节点是否为同一个节点。

    Node.prototype.normalize()

    normalize方法用于清理当前节点内部所有的文本节点。它会去除空的文本节点,并且将毗邻的文本节点合并成一个。

    var wrapper = document.createElement("div");
    
    wrapper.appendChild(document.createTextNode("Part 1 "));
    wrapper.appendChild(document.createTextNode("Part 2 "));
    
    wrapper.childNodes.length // 2
    wrapper.normalize();
    wrapper.childNodes.length // 1
    

    Node.prototype.getRootNode()

    getRootNode方法返回当前节点所在的根节点,与ownerDocument属性作用相同。

  • 相关阅读:
    错误1053:服务没有及时响应启动或控制请求
    错误号码2003 Can't connect to MySQL server 'localhost' (0)
    分析slow-log 每小时慢sql情况
    用spring annotation声明的bean,当打包在jar中时,无法被扫描到
    mysql 锁查看
    linux 使用expect
    tomcat启动报错:java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener
    Spring LDAP authenticate method with Pooling
    一步步教你使用Proguard混淆Java源代码
    JAVA获取CLASSPATH路径
  • 原文地址:https://www.cnblogs.com/chris-jichen/p/10209148.html
Copyright © 2020-2023  润新知