博客列表 >Dom常用增删改操作及留言板案例

Dom常用增删改操作及留言板案例

吴长清
吴长清原创
2022年08月01日 09:18:14439浏览

dom常用增删改操作及留言板案例

1.常用增删改操作的 API

API 描述
createElement(ele) 创建新元素, document上调用
append(string/ele) 追加到父级最后子节点后,在父节点上调用
before(string/ele) 在当前元素之前插入节点, 在当前元素上调用
after(string/ele) 在当前元素之后插入节点, 在当前元素上调用
cloneNode(true) 克隆节点(true:当前节点所有子节点),在要被克隆的节点上调用
replaceChild(ele,pos) 替换子元素,在父级节点上调用
remove(ele) 移除子元素, 在当前节点上调用

代码块:

  1. <!-- 1. 实例演示dom增删改的常用方法 -->
  2. <script>
  3. // 1. 创建元素 在document上调用
  4. // 创建一个ul 创建号的ul在内存中 没有渲染到html页面中
  5. const ul = document.createElement("ul");
  6. // 2.追加元素 在追加的元素的父节点上调用
  7. // 此时追加ul元素 就应该在它的父级元素上调用
  8. document.body.append(ul);
  9. // 在ul下面追加子元素li;
  10. for (let index = 0; index < 5; index++) {
  11. const li = document.createElement("li");
  12. // append() 可以追加元素外还可以追加文本内容
  13. li.append("item-" + (index + 1));
  14. ul.append(li);
  15. }
  16. // 3.在当前元素之前插入元素
  17. // 3.1 创建要插入的元素
  18. let li = document.createElement("li");
  19. // 3.2 追加文本内容
  20. li.append("新元素");
  21. // 3.3 设置css样式
  22. li.style.color = "red";
  23. // 3.4 插入:当前节点.before(新节点)
  24. const item3 = ul.querySelector("li:nth-of-type(3)");
  25. item3.before(li);
  26. // 4.克隆 参数为true时 表示克隆当前元素下的所有子元素 含文本内容
  27. li = li.cloneNode(true);
  28. // 5.在当前元素之后插入元素
  29. item3.after(li);
  30. // 6.替换子元素 在父节点上调用 当前元素.replaceChild(新元素,旧元素)
  31. // 6.1 创建新元素 新值
  32. const newNode = document.createElement("li");
  33. newNode.append("我是替换最后一个li的新元素");
  34. newNode.style.backgroundColor = "cyan";
  35. // 6.2 找到需要被替换的值 最后一个li
  36. const targetNode = document.querySelector("li:last-of-type");
  37. // 6.3 替换
  38. ul.replaceChild(newNode, targetNode);
  39. // 7.移除/删除 在当前节点调用 谁调删谁
  40. ul.firstElementChild.remove();
  41. </script>

效果:

insertAdjacentElement('插入位置', 元素)

插入位置 描述
beforeBegin 开始标签之前,是它的前一个兄弟元素
afterBegin 开始标签之后,第一个子元素
beforeEnd 结束标签之前,它的最后一个子元素
afterEnd 结束标签之后,它的下一个兄弟元素

代码块:

  1. <body>
  2. <ul>
  3. <li>商品1</li>
  4. <li>商品2</li>
  5. <li>商品3</li>
  6. <li>商品4</li>
  7. </ul>
  8. <style>
  9. ul {
  10. border: 1px solid red;
  11. }
  12. </style>
  13. </body>
  1. <script>
  2. // insertAdjacentElement(参数1,参数2)
  3. // 参数1:插入位置 有四个
  4. // 参数2:需要插入的元素 支持标签语义化 能识别html标签
  5. // 获取当前ul元素
  6. const ul = document.querySelector("ul");
  7. // 在当前列表的前面插入一个标题
  8. const h3 = document.createElement("h3");
  9. h3.append("商品列表");
  10. // 在ul开始标签之前插入 插入之后是其兄弟元素 同级
  11. ul.insertAdjacentElement("beforebegin", h3);
  12. // 在ul开始标签之后插入 插入之后是其第一个子元素 子集
  13. ul.insertAdjacentHTML("afterbegin", '<li style="color:red">第一个元素</li>');
  14. // 在ul结束标签之前插入 插入之后是其最后一个子元素 子集
  15. ul.insertAdjacentHTML("beforeend", '<li style="color:blue">最后一个元素</li>');
  16. // 在ul结束标签之后插入 插入之后是其兄弟元素 同级
  17. ul.insertAdjacentHTML("afterend", "<h4>共计: 6个</h4>");
  18. </script>

效果:

2.js操作元素内容

属性 描述
textContent 返回所有文本内容,不包含html标签
innerText 返回正常文本,隐藏的文本不输出
innerHTML 返回所有内容,包含html标签,在输出时html会被正常渲染到文档中
outerHTML 返回字符串,将所有内容包含html标签转为字符串,用于存储一些动态html样式到服务器中

3.自定义属性对象dataset

1.声明方式:以data-为前缀,后面跟上具体的变量名称,如data-name
2.使用方式:ele.dataset.name ele是设置自定义属性的节点元素
3.特例:在声明时除了前缀的标识符-以外,有第二个标识符-,那么使用时可通过驼峰式命名获取自定义属性的值,例如:声明:data-app-name 使用:data-appName

4.案例-留言板

css代码

  1. * {
  2. padding: 0;
  3. margin: 0;
  4. outline: none;
  5. }
  6. li {
  7. list-style: none;
  8. padding: 0 10px;
  9. }
  10. body header {
  11. background-color: antiquewhite;
  12. width: 100%;
  13. height: 50px;
  14. }
  15. body header h3 {
  16. text-align: center;
  17. line-height: 50px;
  18. }
  19. body main {
  20. background-color: lavenderblush;
  21. width: 100%;
  22. height: 500px;
  23. display: grid;
  24. place-items: start center;
  25. }
  26. body main input {
  27. width: 80%;
  28. height: 30px;
  29. margin-top: 10px;
  30. }
  31. body main ul {
  32. width: 80%;
  33. height: 440px;
  34. background-color: white;
  35. box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.404);
  36. }
  37. body main ul li {
  38. display: grid;
  39. grid-template-columns: 10% 80% 10%;
  40. margin-top: 5px;
  41. gap: 0 5px;
  42. }
  43. body main ul li p {
  44. font-size: 14px;
  45. color: #353434;
  46. place-self: center start;
  47. }
  48. body main ul li button {
  49. cursor: pointer;
  50. border: none;
  51. background-color: lightpink;
  52. }
  53. body main ul li button:hover {
  54. background-color: red;
  55. color: white;
  56. }
  57. body main ul li img {
  58. width: 30px;
  59. height: 30px;
  60. border-radius: 30px;
  61. border: 1px solid lightcoral;
  62. place-self: center end;
  63. }

html代码

  1. <header>
  2. <h3>留言板</h3>
  3. </header>
  4. <main>
  5. <!-- onkeydown 键盘事件 -->
  6. <input type="text" onkeydown="addMsg(this)" placeholder="请输入留言" autofocus />
  7. <ul class="list"></ul>
  8. </main>

js代码

  1. function addMsg(ele) {
  2. // 事件方法中有一个对象,表示当前事件: event
  3. // 判断用户是否提交了留言,通过是否按下了回车键
  4. if (event.key === "Enter") {
  5. // 留言非空验证
  6. if (ele.value.length === 0) {
  7. alert("留言不能为空");
  8. // 重置焦点到输入框中
  9. ele.focus();
  10. return false;
  11. }
  12. // 2. 添加留言
  13. ul = document.querySelector(".list");
  14. // 为每条留言添加删除功能
  15. // 创建img元素 且路径随机生成
  16. const img = `<img style='' src='images/${Math.round(Math.random() * 4)}.png'/>`;
  17. // 创建button 并添加单击事件来实现删除功能 传入参数是当前节点的父节点 删除的是整个li
  18. const btn = "<button onclick='del(this.parentNode)'>删除</button>";
  19. // 字符串拼接
  20. ele.value = img + `<p>${ele.value}</p>` + btn;
  21. // insertAdjacentHTML 能识别字符串中的html标签
  22. ul.insertAdjacentHTML("afterbegin", `<li>${ele.value}</li>`);
  23. // 3. 清空输入框
  24. ele.value = null;
  25. }
  26. }
  27. // 删除功能
  28. del = (ele) => (confirm("是否删除?") ? ele.remove() : false);

效果预览

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议