- 创建新节点的方法:
document.createElement(tag)
— 用给定的标签创建一个元素节点,document.createTextNode(value)
— 创建一个文本节点(很少使用),elem.cloneNode(deep)
— 克隆元素,如果deep==true
则与其后代一起克隆。
插入和移除节点的方法:
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
。node.remove()
— 移除node
。
文本字符串被“作为文本”插入。
这里还有“旧式”的方法:
parent.appendChild(node)
parent.insertBefore(node, nextSibling)
parent.removeChild(node)
parent.replaceChild(newElem, node)
- 这些方法都返回
node
。 - 在
html
中给定一些 HTML,elem.insertAdjacentHTML(where, html)
会根据where
的值来插入它:"beforebegin"
— 将html
插入到elem
前面,"afterbegin"
— 将html
插入到elem
的开头,"beforeend"
— 将html
插入到elem
的末尾,"afterend"
— 将html
插入到elem
后面。
另外,还有类似的方法,elem.insertAdjacentText
和 elem.insertAdjacentElement
,它们会插入文本字符串和元素,但很少使用。
- 要在页面加载完成之前将 HTML 附加到页面:
document.write(html)
- 页面加载完成后,这样的调用将会擦除文档。多见于旧脚本。
练习题
1. 创建一个列表
编写一个接口,根据用户输入创建一个列表(list)。
对于每个列表项:
- 使用
prompt
向用户询问列表项的内容。 - 使用用户输入的内容创建
<li>
,并添加到<ul>
。 - 重复以上步骤,直到用户取消输入(按下 Esc 键,或点击
prompt
弹窗的 CANCEL 按钮)。
所有元素应该都是动态创建的。
如果用户输入了 HTML 标签,那么这些内容应该被视为文本进行后续处理。
<!DOCTYPE HTML>
<html>
<body>
<h1>Create a list</h1>
<script>
let ul = document.createElement('ul');
document.body.append(ul);
while (true) {
let data = prompt("请输入", "");
if (!data) {
break;
}
let li = document.createElement('li');
li.textContent = data;
ul.append(li);
}
</script>
</body>
</html>
2. 从对象创建树
let data = {
"Fish": {
"trout": {},
"salmon": {}
},
"Tree": {
"Huge": {
"sequoia": {},
"oak": {}
},
"Flowering": {
"apple tree": {},
"magnolia": {}
}
}
};
function createTreeDom(obj){
// Object.keys得到由key组成的数组
if(!Object.keys(obj).length) return
let ul = document.createElement('ul')
for(key in obj){
let li = document.createElement('li')
li.innerHTML = key
let childUl = createTreeDom(obj[key])
if(childUl){
li.append(childUl)
}
ul.append(li)
}
return ul
}
function createTree(container, obj){
container.append(createTreeDom(obj))
}
createTree(document.body, data)