日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中

發布時間:2023/12/2 HTML 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

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

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

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

Document

復制代碼

任務是編寫一個JavaScript函數,接收一個文本內容,動態生成一個包含該文本的div,返回該Node。

1.1 動態創建Node

1.1.1 innerHTML

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

const template = `

${txt}`;

let tempNode = document.createElement('div');

tempNode.innerHTML = template;

return tempNode.firstChild;

}

const container = document.getElementById('container');

container.appendChild(createNode('hello'));

復制代碼

下面我們看第二種方法

1.1.2 DOMParser

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

function createDocument(txt){

const template = `

${txt}`;

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 = `

${txt}`;

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 = `

${txt}`;

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 = `

${txt}`;

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 = `

${txt}`;

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 = "

hello";

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萬個節點。結果如下:

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

1.2.2 DocumentFragment

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

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

const template = "

hello";

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容器,在頻繁修改查詢但是并不需要直接渲染的場景中。

更多精彩內容,請關注 微信訂閱號“玄說前端”

總結

以上是生活随笔為你收集整理的将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。