亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何將HTML字符轉(zhuǎn)換為DOM節(jié)點(diǎn)并動(dòng)態(tài)添加到文檔中詳解

 更新時(shí)間:2018年08月19日 09:02:37   作者:玄魂工作室  
這篇文章主要給大家介紹了關(guān)于如何將HTML字符轉(zhuǎn)換為DOM節(jié)點(diǎn)并動(dòng)態(tài)添加到文檔中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧

前言

將字符串動(dòng)態(tài)轉(zhuǎn)換為DOM節(jié)點(diǎn),在開發(fā)中經(jīng)常遇到,尤其在模板引擎中更是不可或缺的技術(shù)。

字符串轉(zhuǎn)換為DOM節(jié)點(diǎn)本身并不難,本篇文章主要涉及兩個(gè)主題:

     1 字符串轉(zhuǎn)換為HTML DOM節(jié)點(diǎn)的基本方法及性能測(cè)試

     2 動(dòng)態(tài)生成的DOM節(jié)點(diǎn)添加到文檔中的方法及性能測(cè)試

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

<!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'>
<!-- 動(dòng)態(tài)添加div 
 <div class='child'> XXX</div>
 -->
 </div>
</body>
</html>

任務(wù)是編寫一個(gè)JavaScript函數(shù),接收一個(gè)文本內(nèi)容,動(dòng)態(tài)生成一個(gè)包含該文本的div,返回該Node。下面話不多說了,來隨著小編一起看看詳細(xì)的介紹吧。

1.1 動(dòng)態(tài)創(chuàng)建Node

1.1.1 innerHTML

第一種方法,我們使用document.createElement方法創(chuàng)建新的元素,然后利用innerHTML將字符串注入進(jìn)去,最后返回firstChild,得到動(dòng)態(tài)創(chuàng)建的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 實(shí)例的parseFromString方法可以用來直接將字符串轉(zhuǎn)換為document 文檔對(duì)象。有了document之后,我們就可以利用各種DOM Api來進(jìn)行操作了。

 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 對(duì)象表示一個(gè)沒有父級(jí)文件的最小文檔對(duì)象。它被當(dāng)做一個(gè)輕量版的 Document 使用,用于存儲(chǔ)已排好版的或尚未打理好格式的XML片段。最大的區(qū)別是因?yàn)镈ocumentFragment不是真實(shí)DOM樹的一部分,它的變化不會(huì)引起DOM樹的重新渲染的操作(reflow) ,且不會(huì)導(dǎo)致性能等問題。

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

 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對(duì)象插入到目標(biāo)節(jié)點(diǎn)中,這會(huì)將其所有自己點(diǎn)插入到目標(biāo)節(jié)點(diǎn)中,不包含自身。我們也可以使用

frag.firstChild

來獲取生成的div。

1.1.3 性能測(cè)試

下面我們來簡(jiǎn)單比對(duì)下上面三種方法的性能,只是測(cè)試生成單個(gè)節(jié)點(diǎn),在實(shí)際使用中并不一定有實(shí)際意義。

先測(cè)試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');

測(cè)試100萬個(gè)Node生成,用時(shí) 6322。

再來測(cè)試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');

測(cè)試100萬個(gè)Node生成,用時(shí) 55188。

最后來測(cè)試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();

測(cè)試100萬個(gè)Node生成,用時(shí) 6210。

createDocumentFragment方法和createNode方法,在這輪測(cè)試中不相上下。下面我們看看將生成的DOM元素動(dòng)態(tài)添加到文檔中的方法。

1.2.0 批量添加節(jié)點(diǎn)

被動(dòng)態(tài)創(chuàng)建出來的節(jié)點(diǎn)大多數(shù)情況都是要添加到文檔中,顯示出來的。下面我們來介紹并對(duì)比幾種常用的方案。
下面我們批量添加的方法都采用createDocumentFragment方法。

1.2.1 直接append

直接append方法,就是生成一個(gè)節(jié)點(diǎn)就添加到文檔中,當(dāng)然這會(huì)引起布局變化,被普遍認(rèn)為是性能最差的方法。

 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);

上面的代碼我們測(cè)算動(dòng)態(tài)添加10萬個(gè)節(jié)點(diǎn)。結(jié)果如下:

測(cè)試1000個(gè)節(jié)點(diǎn)耗時(shí)20毫秒,測(cè)試10000個(gè)節(jié)點(diǎn)耗時(shí)10001毫秒,測(cè)試100000個(gè)節(jié)點(diǎn)耗時(shí)46549毫秒。

1.2.2 DocumentFragment

上面我們已經(jīng)介紹過DocumentFragment了,利用它轉(zhuǎn)換字符串。下面我們利用該對(duì)象來作為臨時(shí)容器,一次性添加多個(gè)節(jié)點(diǎn)。

利用document.createDocumentFragment()方法可以創(chuàng)建一個(gè)空的DocumentFragment對(duì)象。

    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);

測(cè)試1000個(gè)節(jié)點(diǎn)耗時(shí)25毫秒,10000個(gè)節(jié)點(diǎn)耗時(shí)2877毫秒,100000個(gè)節(jié)點(diǎn)瀏覽器卡死。

1.3 小結(jié)

簡(jiǎn)單了介紹了幾種方法,并沒有什么技術(shù)含量。但是從動(dòng)態(tài)添加節(jié)點(diǎn)來看,網(wǎng)上說的DocumentFragment方法性能遠(yuǎn)遠(yuǎn)好于直接append的說法在我的測(cè)試場(chǎng)景中并不成立。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • webpack代碼分片的實(shí)現(xiàn)

    webpack代碼分片的實(shí)現(xiàn)

    代碼分片是webpck打包工具所特有的一項(xiàng)技術(shù),通過這項(xiàng)功能可以把代碼按照特定的形式進(jìn)行拆分,使用戶不必一次全部加載,而是按需加載。本文就來詳細(xì)介紹,感興趣的可以了解一下
    2021-07-07
  • 微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能【附源碼下載】

    微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能【附源碼下載】

    這篇文章主要介紹了微信小程序使用picker實(shí)現(xiàn)時(shí)間和日期選擇框功能,結(jié)合實(shí)例形式分析了微信小程序picker組件進(jìn)行日期與時(shí)間選擇的相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • Bootstrap圖片輪播組件Carousel使用方法詳解

    Bootstrap圖片輪播組件Carousel使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap圖片輪播組件Carousel使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 關(guān)于JS控制代碼暫停的實(shí)現(xiàn)方法分享

    關(guān)于JS控制代碼暫停的實(shí)現(xiàn)方法分享

    關(guān)于JS控制代碼暫停的工作總結(jié),需要的朋友可以參考下
    2012-10-10
  • JavaScript讀取本地文件常用方法流程解析

    JavaScript讀取本地文件常用方法流程解析

    這篇文章主要介紹了JavaScript讀取本地文件常用方法流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 如何解決日期函數(shù)new Date()瀏覽器兼容性問題

    如何解決日期函數(shù)new Date()瀏覽器兼容性問題

    這篇文章主要介紹了如何解決日期函數(shù)new Date()瀏覽器兼容性問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 如何利用JavaScript?實(shí)現(xiàn)繼承

    如何利用JavaScript?實(shí)現(xiàn)繼承

    這篇文章主要介紹了如何利用JavaScript?實(shí)現(xiàn)繼承,JavaScript?在編程語言界是個(gè)特殊種類,它和其他編程語言很不一樣,JavaScript可以在運(yùn)行的時(shí)候動(dòng)態(tài)地改變某個(gè)變量的類型,下面小編將繼續(xù)介紹JavaScript如何實(shí)現(xiàn)繼承,需要的朋友可以參考下
    2022-02-02
  • JS/HTML5游戲常用算法之路徑搜索算法 隨機(jī)迷宮算法詳解【普里姆算法】

    JS/HTML5游戲常用算法之路徑搜索算法 隨機(jī)迷宮算法詳解【普里姆算法】

    這篇文章主要介紹了JS/HTML5游戲常用算法之路徑搜索算法 隨機(jī)迷宮算法,結(jié)合實(shí)例形式詳細(xì)分析了針對(duì)迷宮游戲路徑搜索算法的普里姆算法相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • JavaScript實(shí)現(xiàn)商品放大鏡效果

    JavaScript實(shí)現(xiàn)商品放大鏡效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)商品放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • TypeScript中使用getElementXXX()的示例代碼

    TypeScript中使用getElementXXX()的示例代碼

    這篇文章主要介紹了TypeScript中使用getElementXXX()的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論