Create DOM from HTML string
可以用來以 string 創建 DOM 的方法有
Range.createContextualFragnemnt()Element.insertAdjacentHTML()Element.innerHTMLDOMParser.parseFromString()
DOMParser.parseFromString()最慢;Range.createContextualFragnemnt() 在 Firefox 最快。
Performance
如果一次要加入多個 nodes,建議使用 DocumentFragment 處例;該 method 只會造成一次 reflow。
Table Column
<theade>、<tbody>、<tr>、<td> 只能被置放在相關的父節點中,例如:<tbody> 只能被置入於 <table> 中;其他情況話會返回 null。
Script Execution
-
除了
Range.createContextualFragnemnt()外,其他方法皆會防止插入/執行<script>。 -
<img onerror="alert(!)" />中的 onError 會被執行,需要手動移除。
Range.createContextualFragnemnt()
!! 會執行 script tag !!
const range = document.createRange()
const template = range.createContextualFragment('<div>Content</div>')
someElement.appendChild(template)
Element.insertAdjacentHTML()
someElement.insertAdjacentHTML('beforeEnd', '<div>Content</div>')
第一個參數為插入 DOM 的位置
<!-- beforebegin -->
<p>
<!-- afterbegin -->
foo
<!-- beforeend -->
</p>
<!-- afterend -->
Element.innerHTML
會造成
Element本身也重新渲染,效能上會比Element.insertAdjacentHTML()差一點。
someElement.innerHTML = '<div>Content</div>'
DOMParse.parseFromString()
const parser = new DOMParser()
const element = parser.parseFromString('<div>Content</div>', 'text/html')
someElement.appendElement(element)