前言
- 之前的文章,筆者講述了渲染帶有跳脫字元的字串的方法
- 傳送門:https://segmentfault.com/a/1190000044471416
- 圖示,就是渲染介面返回的這樣的:
- 我們最終渲染成如下樣子:
需求-渲染html字串
- 現在介面返回的,不是上述型別的了,而是帶標籤乃至樣式的,如下:
let str = '<b style=\"background-color: rgb(214, 239, 214);\">白日依山盡</b>'
- 即我們需要把str字串,渲染這樣的html標籤字串,到頁面上
- 最方便的方式,就是直接使用
v-html
幫我們渲染 v-html='str'
- 當然我們也可以自己仿寫一個簡單的
v-html
方案一:仿寫v-html自定義指令 實現對應需求
主要是使用innerHTML
屬性欄位
仿寫自定義指令如下:
export default {
// 在繫結元素的插入鉤子中進行相應的操作
inserted: function (el, binding) {
// 獲取傳入指令的值(即要渲染的HTML字串)
const htmlStr = binding.value;
// 將HTML內容新增到元素內部
el.innerHTML = htmlStr;
},
// update鉤子中更新變化時,修改內容
update: function (el, binding) {
// 當新值不等於舊值時,才更改內容
if (binding.oldValue !== binding.value) {
el.innerHTML = binding.value;
}
}
}
示例網址:http://ashuai.work:8888/#/myhtml
github地址:https://github.com/shuirongshuifu/elementSrcCodeStudy
方案二: 使用DOMParser介面api 實現對應需求
什麼是DOMParser,幹啥的
官方文件:https://developer.mozilla.org/zh-CN/docs/Web/API/DOMParser
DOMParser
顧名思義,就是可以做dom解析
相關的- 除了解析
html
,還可以解析xml
,svg
等 - 比如,把
html標籤字串
解析為html文件
如下案例更加通俗易懂:
<script>
let str = '<p><img style=\"width: 190px;\" src=\"http://ashuai.work/static/img/avantar.png\"><br></p>'
let parser = new DOMParser() // 生產dom解析器例項
let doc = parser.parseFromString(str, 'text/html') // 呼叫對應解析方法,將字串解析為html文件
console.log(doc); // 檢視解析後的文件
</script>
使用DOMParser實現
複製貼上演示即可
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="wrap"></div>
<script>
// 富文字編輯器介面返回的字串
let str = '<p><b style=\"background-color: rgb(214, 239, 214);\">白日依山盡</b></p><p><i style=\"background-color: rgb(214, 239, 214);\">黃河入海流</i></p><p><u style=\"background-color: rgb(214, 239, 214);\">欲窮千里目</u></p><p><strike style=\"background-color: rgb(214, 239, 214);\">更上一層樓</strike></p>'
let parser = new DOMParser() // 生產dom解析器例項
let doc = parser.parseFromString(str, 'text/html') // 呼叫對應方法,將字串解析為html文件
let wrap = document.querySelector('.wrap') // 獲取容器
// 獲取body內的所有子節點
let bodyChildren = doc.body.childNodes;
// 遍歷,一個個追加節點(以及子節點)
for (let i = 0; i < bodyChildren.length; i++) {
wrap.appendChild(bodyChildren[i].cloneNode(true));
}
</script>
</body>
</html>
- 新語法api:
node.cloneNode(deep)
- 預設deep為false,僅克隆節點及其屬性
- 設定為true時,克隆節點、其屬性和後代(類似於遞迴克隆複製)
效果圖
思考innerHTML和DOMParser那個好
- 如果能夠確保這個html標籤字串是安全的、沒問題的,直接innerHTML是最為方便的
- 但是,DOMParser進行解析後,明顯可以做更多的操作,更為靈活!
- 進一步而言
- 在網路爬蟲指令碼中,當抓取到HTML頁面內容後,可以利用DOMParser解析這些內容,以便於提取特定的資訊或進行資料清洗。
- 再一個,我們在開發瀏覽器擴充外掛的時候,可能需要解析和操作頁面中的XML或HTML資料,DOMParser可以幫助實現這一功能
- 除此之外,在離線斷網情況下,DOMParser可以用來讀取和解析這些html資源,進而構建應用程式所需的UI樣式結構
所以,這樣一看,明顯是DOMParser更加強大!
- 此外,一些知名的npm包,也用到了DOMParser去解析和操作 HTML 或 XML 資料。
- cheerio:一個類似於 jQuery 的庫,用於在伺服器端解析和操作 HTML 資料。它通常用於爬蟲、資料抓取和資料處理等場景中,可能會用到 DOMParser。地址:https://www.npmjs.com/package/cheerio
- xml2js:一個用於將 XML 資料轉換為 JavaScript 物件的庫。在處理 XML 資料時,xml2js 可能會使用 DOMParser 來解析 XML 資料。地址:https://www.npmjs.com/package/xml2js
- jsdom:一個在 Node.js 環境中模擬瀏覽器環境的庫,用於在伺服器端操作 DOM。jsdom 可能會使用 DOMParser 來解析 HTML 或 XML 資料。地址:https://www.npmjs.com/package/jsdom
- parse5:一個快速而魯棒的 HTML 解析器,用於解析和操作 HTML 資料。parse5 可能會使用 DOMParser 來解析 HTML 資料。地址:https://www.npmjs.com/package/parse5
A good memory is better than a bad pen. Write it down...