• 创建新节点的方法:
    • 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.insertAdjacentTextelem.insertAdjacentElement,它们会插入文本字符串和元素,但很少使用。

  • 要在页面加载完成之前将 HTML 附加到页面:
    • document.write(html)
  • 页面加载完成后,这样的调用将会擦除文档。多见于旧脚本。

练习题

1. 创建一个列表

编写一个接口,根据用户输入创建一个列表(list)。
对于每个列表项:

  1. 使用 prompt 向用户询问列表项的内容。
  2. 使用用户输入的内容创建 <li>,并添加到 <ul>
  3. 重复以上步骤,直到用户取消输入(按下 Esc 键,或点击 prompt 弹窗的 CANCEL 按钮)。

所有元素应该都是动态创建的。
如果用户输入了 HTML 标签,那么这些内容应该被视为文本进行后续处理。

  1. <!DOCTYPE HTML>
  2. <html>
  3. <body>
  4. <h1>Create a list</h1>
  5. <script>
  6. let ul = document.createElement('ul');
  7. document.body.append(ul);
  8. while (true) {
  9. let data = prompt("请输入", "");
  10. if (!data) {
  11. break;
  12. }
  13. let li = document.createElement('li');
  14. li.textContent = data;
  15. ul.append(li);
  16. }
  17. </script>
  18. </body>
  19. </html>

2. 从对象创建树

  1. let data = {
  2. "Fish": {
  3. "trout": {},
  4. "salmon": {}
  5. },
  6. "Tree": {
  7. "Huge": {
  8. "sequoia": {},
  9. "oak": {}
  10. },
  11. "Flowering": {
  12. "apple tree": {},
  13. "magnolia": {}
  14. }
  15. }
  16. };
  17. function createTreeDom(obj){
  18. // Object.keys得到由key组成的数组
  19. if(!Object.keys(obj).length) return
  20. let ul = document.createElement('ul')
  21. for(key in obj){
  22. let li = document.createElement('li')
  23. li.innerHTML = key
  24. let childUl = createTreeDom(obj[key])
  25. if(childUl){
  26. li.append(childUl)
  27. }
  28. ul.append(li)
  29. }
  30. return ul
  31. }
  32. function createTree(container, obj){
  33. container.append(createTreeDom(obj))
  34. }
  35. createTree(document.body, data)