美文网首页
JavaScript操作DOM常用的API学习总结上

JavaScript操作DOM常用的API学习总结上

作者: 饕餮潴 | 来源:发表于2018-11-03 23:55 被阅读11次

    DOM

    DOM(Document Object Model)文档对象模型,针对HTML XML提供的api,用以变成的方式操作(增删改查)html内容。

    访问DOM

    通过js调用document和window元素的api来操作文档或获取文档信息。

    Node

    Node是一个接口,通过这个接口集成方法和属性:
    Document, Element, CharacterData (which Text, Comment, and CDATASection inherit), ProcessingInstruction, DocumentFragment, DocumentType, Notation, Entity, EntityReference。
    node中有一个nodeType的属性,是一个整数不同的值代表不同节点类型:

    image.png
    Element

    Element提供了对元素标签名,子节点和特性的访问,我们常用HTML元素比如div,span,a等标签就是element中的一种。Element有下面几条特性:
    (1)nodeType为1
    (2)nodeName为元素标签名,tagName也是返回标签名
    (3)nodeValue为null
    (4)parentNode可能是Document或Element
    (5)子节点可能是Element,Text,Comment,Processing_Instruction,CDATASection或EntityReference

    Text

    Text表示文本节点,它包含的是纯文本内容,不能包含html代码,但可以包含转义后的html代码。Text有下面的特性:
    (1)nodeType为3
    (2)nodeName为#text
    (3)nodeValue为文本内容
    (4)parentNode是一个Element
    (5)没有子节点

    Comment

    Comment表示HTML文档中的注释,它有下面的几种特征:
    (1)nodeType为8
    (2)nodeName为#comment
    (3)nodeValue为注释的内容
    (4)parentNode可能是Document或Element
    (5)没有子节点

    Document

    Document表示文档,在浏览器中,document对象是HTMLDocument的一个实例,表示整个页面,它同时也是window对象的一个属性。Document有下面的特性:
    (1)nodeType为9
    (2)nodeName为#document
    (3)nodeValue为null
    (4)parentNode为null
    (5)子节点可能是一个DocumentType或Element

    DocumentFragment

    DocumentFragment是所有节点中唯一一个没有对应标记的类型,它表示一种轻量级的文档,可能当作一个临时的仓库用来保存可能会添加到文档中的节点。DocumentFragment有下面的特性:
    (1)nodeType为11
    (2)nodeName为#document-fragment
    (3)nodeValue为null
    (4)parentNode为null

    节点创建型API

    用如其名,这类API是用来创建节点的
    要注意:创建的元素并不属于HTML文档,它只是创建出来,并未添加到HTML文档中,要调用appendChild或insertBefore等方法将其添加到HTML文档树中。
    ######## createElement
    createElement通过传入指定的一个标签名来创建一个元素,如果传入的标签名是一个未知的,则会创建一个自定义的标签,注意:IE8以下浏览器不支持自定义标签。
    'let element = document.createElement(tagName)'

      elem.id = 'test';
      elem.style = 'color: red';
      elem.innerHTML = '我是新创建的节点';
      document.body.appendChild(elem); 
    
    createTextNode

    createTextNode用来创建一个文本节点

      var node = document.createTextNode("我是文本节点");
      document.body.appendChild(node);
    
    cloneNode

    cloneNode返回调用该方法的节点的一个副本

    <body>
      <div id="parent">
        我是父元素的文本
        <br/>
        <span>
            我是子元素
        </span>
      </div>
      <button id="btnCopy">复制</button>
    </body>
    <script>
      var parent = document.getElementById("parent");
      document.getElementById("btnCopy").onclick = function(){
        var parent2 = parent.cloneNode(true);
        parent2.id = "parent2";
        document.body.appendChild(parent2);
      }
    </script>
    
    createDocumentFragment

    DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。
    因为文档片段存在于内存中,并不在DOM树中,所以将子元素插入到文档片段时不会引起页面回流(reflow)(对元素位置和几何上的计算)。因此,使用文档片段document fragments 通常会起到优化性能的作用。

    <body>
      <ul id="ul"></ul>
    </body>
    <script>
      (function()
      {
        var start = Date.now();
        var str = '', li;
        var ul = document.getElementById('ul');
        var fragment = document.createDocumentFragment();
        for(var i=0; i<1000; i++)
        {
            li = document.createElement('li');
            li.textContent = '第'+(i+1)+'个子节点';
            fragment.appendChild(li);
        }
        ul.appendChild(fragment);
      })();
    </script>
    

    页面修改api

    appendChild这个方法很简单,但是还有有一点需要注意:如果被添加的节点是一个页面中存在的节点,则执行后这个节点将会添加到指定位置,其原本所在的位置将移除该节点,也就是说不会同时存在两个该节点在页面上,相当于把这个节点移动到另一个地方。
    如果child绑定了事件,被移动时,它依然绑定着该事件。

    <body>
      <div id="child">
        要被添加的节点
      </div>
      <br/>
      <br/>
      <br/>
      <div id="parent">
        要移动的位置
      </div>        
      <input id="btnMove" type="button" value="移动节点" />
    </body>
    <script>
      document.getElementById("btnMove").onclick = function(){
          var child = document.getElementById("child");
          document.getElementById("parent").appendChild(child);
      } 
    </script>
    
    nsertBefore

    用来添加一个节点到一个参照节点之前
    parentNode表示新节点被添加后的父节点 newNode表示要添加的节点 refNode表示参照节点,新节点会添加到这个节点之前

    <body>
      <div id="parent">
        父节点
        <div id="child">                
            子元素
        </div>
      </div>
      <input type="button" id="insertNode" value="插入节点" />
    </body>
    <script>
      var parent = document.getElementById("parent");
      var child = document.getElementById("child");
      document.getElementById("insertNode").onclick = function(){
        var newNode = document.createElement("div");
        newNode.textContent = "新节点"
        parent.insertBefore(newNode,child);
      }
    </script>
    

    注意:
    (1)refNode是必传的,如果不传该参数会报错
    (2)如果refNode是undefined或null,则insertBefore会将节点添加到子元素的末尾

    removeChild

    删除指定的子节点并返回
    deletedChild指向被删除节点的引用,它等于node,被删除的节点仍然存在于内存中,可以对其进行下一步操作。
    注意:如果被删除的节点不是其子节点,则程序将会报错。

    tiankeng
    
    replaceChild

    用于使用一个节点替换另一个节点
    newChild是替换的节点,可以是新的节点,也可以是页面上的节点,如果是页面上的节点,则其将被转移到新的位置 oldChild是被替换的节点

    <body>
      <div id="parent">
        父节点
        <div id="child">                
            子元素
        </div>
      </div>
      <input type="button" id="insertNode" value="替换节点" />
    </body>
    <script>
      var parent = document.getElementById("parent");
      var child = document.getElementById("child");
      document.getElementById("insertNode").onclick = function(){
        var newNode = document.createElement("div");
        newNode.textContent = "新节点"
        parent.replaceChild(newNode,child)
      }
    
    

    相关文章

      网友评论

          本文标题:JavaScript操作DOM常用的API学习总结上

          本文链接:https://www.haomeiwen.com/subject/rwwtzftx.html