创建节点
document.createElement(tag: string)
:用给定的标签创建一个元素节点document.createElementNS(namespace: string, tag: string)
:创建指定 命名空间 下给定标签的元素节点document.createTextNode(text: string)
:用给定的文本创建一个文本节点document.createComment(data: string)
:用给定的内容创建一个注释节点document.createDocumentFragment()
:创建一个片段节点- 片段节点:
DocumentFragment
是一个特殊的 DOM 节点,用作来传递节点列表的包装器(wrapper) - 可以向其附加其他节点,但是当将其插入某个位置时,则会插入其内容,而不是自身
- 片段节点:
克隆节点
elem.cloneNode(deep?: boolean)
deep
可选,默认为false
,代表是否“深”克隆(同时克隆子孙节点)
插入节点
append
、prepend
、before
、after
node.append(...nodes or strings)
—— 在node
末尾插入节点或字符串node.prepend(...nodes or strings)
—— 在node
开头插入节点或字符串node.before(...nodes or strings)
—— 在node
前面插入节点或字符串node.after(...nodes or strings)
—— 在node
后面插入节点或字符串node.replaceWith(...nodes or strings)
—— 将node
替换为给定的节点或字符串
注意:
- 可以在单个调用中插入多个节点列表和文本片段
- 如:
div.before('<p>Hello</p>', document.createElement('hr'))
- 如:
- 文字都被“作为文本”插入,而不是“作为 HTML 代码”。因此像
<
、>
这样的符号都会被作转义处理来保证正确显示
elem.insertAdjacent*
elem.insertAdjacentHTML(where, html)
where
:指定相对于elem
的插入位置,必须为以下之一:"beforebegin"
—— 将html
插入到elem
之前"afterbegin"
—— 将html
插入到elem
开头"beforeend"
—— 将html
插入到elem
末尾"afterend"
—— 将html
插入到elem
之后
html
:HTML 字符串,该字符串会被“作为 HTML” 插入
elem.insertAdjacentText(where, text)
—— 是将text
字符串“作为文本”插入而不是作为 HTMLelem.insertAdjacentElement(where, elem)
—— 插入的是一个元素节点
后两个方法的存在主要是为了使语法“统一”。实际上,大多数时候只使用 insertAdjacentHTML
。因为对于元素和文本,有 append/prepend/before/after
方法 —— 它们也可以用于插入节点/文本片段,而且写起来更短。
移除节点
node.remove()
注意:如果要将一个元素移动到另一个地方,则无需将其从原来的位置中删除。所有插入方法都会自动从旧位置删除该节点
其他
其他修改 DOM 的方式
老旧的插入/移除方法
parentElem.appendChild(node)
:将node
附加为parentElem
的最后一个子元素parentElem.insertBefore(node, nextSibling)
:在parentElem
的nextSibling
前插入node
- 在第一个子元素前插入:
parentElem.insertBefore(node, parentElem.firstChild)
- 在第一个子元素前插入:
parentElem.replaceChild(node, oldChild)
:将parentElem
的后代中的oldChild
替换为node
parentElem.removeChild(node)
:从parentElem
中删除node
(假设node
为parentElem
的后代)
以上方法都会返回插入/移除的节点
document.write(html: string)
调用 document.write(html)
意味着将 html
“就地马上”写入页面。这个方法来自于没有 DOM,没有标准的上古时期。
- 当在浏览器正在读取(“解析”)传入的 HTML 时调用
document.write
方法来写入一些东西,浏览器会像它本来就在 HTML 文本中那样使用它- 所以它运行起来出奇的快,因为它不涉及 DOM 修改。它直接写入到页面文本中,而此时 DOM 尚未构建。
- 当在 DOM 加载完成后,这样的调用将会现有文档内容擦除,再设置新的文档内容,之后浏览器重新解析