91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何將HTML字符轉換為DOM節點并動態添加到文檔中詳解

發布時間:2020-08-31 10:00:54 來源:腳本之家 閱讀:360 作者:玄魂工作室 欄目:web開發

前言

將字符串動態轉換為DOM節點,在開發中經常遇到,尤其在模板引擎中更是不可或缺的技術。

字符串轉換為DOM節點本身并不難,本篇文章主要涉及兩個主題:

     1 字符串轉換為HTML DOM節點的基本方法及性能測試

     2 動態生成的DOM節點添加到文檔中的方法及性能測試

本文的示例: 有如下代碼段

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
</head>
<body>
 <div id='container'>
<!-- 動態添加div 
 <div class='child'> XXX</div>
 -->
 </div>
</body>
</html>

任務是編寫一個JavaScript函數,接收一個文本內容,動態生成一個包含該文本的div,返回該Node。下面話不多說了,來隨著小編一起看看詳細的介紹吧。

1.1 動態創建Node

1.1.1 innerHTML

第一種方法,我們使用document.createElement方法創建新的元素,然后利用innerHTML將字符串注入進去,最后返回firstChild,得到動態創建的Node。

 <script>
  function createNode(txt) {
   const template = `<div class='child'>${txt}</div>`;
   let tempNode = document.createElement('div');
   tempNode.innerHTML = template;
   return tempNode.firstChild;
  }
  const container = document.getElementById('container');
  container.appendChild(createNode('hello'));
 </script>

下面我們看第二種方法

1.1.2 DOMParser

DOMParser 實例的parseFromString方法可以用來直接將字符串轉換為document 文檔對象。有了document之后,我們就可以利用各種DOM Api來進行操作了。

 function createDocument(txt) {
   const template = `<div class='child'>${txt}</div>`;
   let doc = new DOMParser().parseFromString(template, 'text/html');
   let div = doc.querySelector('.child');
   return div;
  }
  
  const container = document.getElementById('container');
  container.appendChild(createDocument('hello'));

1.1.2 DocumentFragment

DocumentFragment 對象表示一個沒有父級文件的最小文檔對象。它被當做一個輕量版的 Document 使用,用于存儲已排好版的或尚未打理好格式的XML片段。最大的區別是因為DocumentFragment不是真實DOM樹的一部分,它的變化不會引起DOM樹的重新渲染的操作(reflow) ,且不會導致性能等問題。

利用document.createRange().createContextualFragment方法,我們可以直接將字符串轉化為DocumentFragment對象。

 function createDocumentFragment(txt) {
   const template = `<div class='child'>${txt}</div>`;
   let frag = document.createRange().createContextualFragment(template);
   return frag;
  }

  const container = document.getElementById('container');
  container.appendChild(createDocumentFragment('hello'));

這里要注意的是我們直接將生成的DocumentFragment對象插入到目標節點中,這會將其所有自己點插入到目標節點中,不包含自身。我們也可以使用

frag.firstChild

來獲取生成的div。

1.1.3 性能測試

下面我們來簡單比對下上面三種方法的性能,只是測試生成單個節點,在實際使用中并不一定有實際意義。

先測試createNode。

 function createNode(txt) {
   const template = `<div class='child'>${txt}</div>`;

   let start = Date.now();
   for (let i = 0; i < 1000000; i++) {
    let tempNode = document.createElement('div');
    tempNode.innerHTML = template;
    let node = tempNode.firstChild;
   }
   console.log(Date.now() - start);

  }
  createNode('hello');

測試100萬個Node生成,用時 6322。

再來測試createDocument。

 function createDocument(txt) {
   const template = `<div class='child'>${txt}</div>`;
   let start = Date.now();
   for (let i = 0; i < 1000000; i++) {
    let doc = new DOMParser().parseFromString(template, 'text/html');
    let div = doc.firstChild;
   }
   console.log(Date.now() - start);
  }
 createDocument('hello');

測試100萬個Node生成,用時 55188。

最后來測試createDocumentFragment.

 function createDocumentFragment(txt) {
   const template = `<div class='child'>${txt}</div>`;
   let start = Date.now();
   for (let i = 0; i < 1000000; i++) {
   let frag = document.createRange().createContextualFragment(template);
   }
   console.log(Date.now() - start);
  }
  createDocumentFragment();

測試100萬個Node生成,用時 6210。

createDocumentFragment方法和createNode方法,在這輪測試中不相上下。下面我們看看將生成的DOM元素動態添加到文檔中的方法。

1.2.0 批量添加節點

被動態創建出來的節點大多數情況都是要添加到文檔中,顯示出來的。下面我們來介紹并對比幾種常用的方案。
下面我們批量添加的方法都采用createDocumentFragment方法。

1.2.1 直接append

直接append方法,就是生成一個節點就添加到文檔中,當然這會引起布局變化,被普遍認為是性能最差的方法。

 const template = "<div class='child'>hello</div>";

  function createDocumentFragment() {


   let frag = document.createRange().createContextualFragment(template);
   return frag;
  }
  // createDocumentFragment();
  const container = document.getElementById('container');
  let start = Date.now();
  for (let i = 0; i < 100000; i++) {
   container.appendChild(createDocumentFragment());
  }
  console.log(Date.now() - start);

上面的代碼我們測算動態添加10萬個節點。結果如下:

如何將HTML字符轉換為DOM節點并動態添加到文檔中詳解

測試1000個節點耗時20毫秒,測試10000個節點耗時10001毫秒,測試100000個節點耗時46549毫秒。

1.2.2 DocumentFragment

上面我們已經介紹過DocumentFragment了,利用它轉換字符串。下面我們利用該對象來作為臨時容器,一次性添加多個節點。

利用document.createDocumentFragment()方法可以創建一個空的DocumentFragment對象。

    const template = "<div class='child'>hello</div>";

    function createDocumentFragment() {


      let frag = document.createRange().createContextualFragment(template);
      return frag;
    }
    // createDocumentFragment();
    const container = document.getElementById('container');
    let fragContainer = document.createDocumentFragment();
    let start = Date.now();
    for (let i = 0; i < 1000; i++) {
      fragContainer.appendChild(createDocumentFragment());
    }
    container.appendChild(fragContainer);
    console.log(Date.now() - start);

測試1000個節點耗時25毫秒,10000個節點耗時2877毫秒,100000個節點瀏覽器卡死。

1.3 小結

簡單了介紹了幾種方法,并沒有什么技術含量。但是從動態添加節點來看,網上說的DocumentFragment方法性能遠遠好于直接append的說法在我的測試場景中并不成立。

DocumentFragment正確的應用場景應該是作為虛擬DOM容器,在頻繁修改查詢但是并不需要直接渲染的場景中。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开远市| 赤水市| 眉山市| 庆云县| 宣化县| 绥江县| 韩城市| 娱乐| 繁峙县| 淄博市| 普宁市| 大姚县| 洛扎县| 万盛区| 太康县| 德庆县| 海口市| 固始县| 吉水县| 宁城县| 宁强县| 浏阳市| 长汀县| 于田县| 醴陵市| 顺义区| 大英县| 嫩江县| 九寨沟县| 镇远县| 扎赉特旗| 蒲城县| 临安市| 汽车| 安徽省| 西城区| 内黄县| 乐东| 宿迁市| 太康县| 麦盖提县|