博客列表 >前端 - JS - DOM操作和事件处理

前端 - JS - DOM操作和事件处理

郴
原创
2020年06月24日 12:59:31671浏览

前端 - JS - DOM操作和事件处理

一、DOM操作

  • 节点:html文档中所有内容都是节点

  • 节点树:DOM树

  • 节点类型:1.元素,2.属性,3.文本,6.注释,9.文档,11.文档片断,其余为XML节点

  • 节点集合类型:NodeList(节点列表)和HTMLCollection(HTML集合)

1. 获取节点(单个、多个、相邻节点、兄弟节点、子节点和属性节点)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <form action="" id="f1">
  10. <input type="text" name="username" id="username">
  11. </form>
  12. <form action="" id="f2">
  13. <input type="text" name="username" id="username">
  14. </form>
  15. <form action="" id="f3">
  16. <input type="text" name="password" id="password">
  17. </form>
  18. <ul class="u">
  19. <li class="uli">列表项1</li>
  20. <li class="uli">列表项2</li>
  21. <li class="uli">列表项3</li>
  22. <li class="uli">列表项4</li>
  23. </ul>
  24. <ol class="o">
  25. <li class="oli">列表项1</li>
  26. <li class="oli">列表项2</li>
  27. <li class="oli">列表项3</li>
  28. <li class="oli">列表项4</li>
  29. </ol>
  30. <script>
  31. //获取文档类型对象
  32. console.log(document.doctype);
  33. //获取html元素
  34. console.log(document.documentElement);
  35. //获取head元素
  36. console.log(document.head);
  37. //获取body元素
  38. console.log(document.body);
  39. //获取title元素
  40. console.log(document.title);
  41. //获取表单元素集合,节点集合类型为HTMLCollection
  42. console.log(document.forms);
  43. // 1. 根据标签获取,返回HTMLCollection对象
  44. console.log(document.getElementsByTagName("ul"));
  45. console.log(document.getElementsByTagName("form"));
  46. // 2. 根据id获取
  47. console.log(document.getElementById("f1"));
  48. // 3. 根据类获取,返回HTMLCollection对象
  49. console.log(document.getElementsByClassName("u"));
  50. console.log(document.getElementsByClassName("oli"));
  51. // 4. 根据name属性获取,返回NodeList对象
  52. console.log(document.getElementsByName("password"));
  53. console.log(document.getElementsByName("username"));
  54. // 5. 根据CSS选择器获取,返回NodeList对象
  55. console.log(document.querySelector(".uli"));
  56. console.log(document.querySelectorAll(".uli"));
  57. //1. 获取前一个相邻节点和获取前一个兄弟节点
  58. console.log(document.getElementsByTagName("ol")[0].previousSibling);
  59. console.log(document.getElementsByTagName("ol")[0].previousElementSibling);
  60. //2. 获取下一个相邻节点和获取下一个兄弟节点
  61. console.log(document.getElementsByTagName("ol")[0].nextSibling);
  62. console.log(document.getElementsByTagName("ol")[0].nextElementSibling);
  63. //3. 获取子节点,返回NodeList对象
  64. console.log(document.getElementsByTagName("ol")[0].childNodes);
  65. //4. 获取子节点,返回HTMLCollection对象
  66. console.log(document.getElementsByTagName("ol")[0].children);
  67. //5. 获取第一个子节点和获取第一个元素节点
  68. console.log(document.getElementsByTagName("ol")[0].firstChild);
  69. console.log(document.getElementsByTagName("ol")[0].firstElementChild);
  70. //5. 获取最后一个子节点和获取最后一个元素节点
  71. console.log(document.getElementsByTagName("ol")[0].lastChild);
  72. console.log(document.getElementsByTagName("ol")[0].lastElementChild);
  73. //获取某个元素的属性节点,返回NamedNodeMap对象
  74. console.log(document.getElementById("f1").attributes);
  75. </script>
  76. </body>
  77. </html>

2. 节点的增删改查

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <form action="" id="f1">
  10. <input type="submit" value="提交" />
  11. </form>
  12. <form action="" id="f2">
  13. <input type="text" name="username" id="username" />
  14. </form>
  15. <form action="" id="f3">
  16. <input type="text" name="password" id="password" />
  17. </form>
  18. <button>重置</button>
  19. <ul class="u">
  20. <li class="uli">列表项1</li>
  21. <li class="uli">列表项2</li>
  22. <li class="uli">列表项3</li>
  23. <li class="uli">列表项4</li>
  24. </ul>
  25. <ol class="o">
  26. <li class="oli">列表项1</li>
  27. <li class="oli">列表项2</li>
  28. <li class="oli">列表项3</li>
  29. <li class="oli">列表项4</li>
  30. </ol>
  31. <script>
  32. //1. 返回节点类型、节点名称
  33. console.log(document.getElementsByClassName("uli")[0].nodeType);
  34. console.log(document.getElementsByClassName("uli")[0].nodeName);
  35. //2. 返回节点的值
  36. //文本节点的内容
  37. console.log(
  38. document.getElementsByTagName("button")[0].childNodes[0].nodeValue
  39. );
  40. //属性节点的值
  41. console.log(
  42. document.getElementsByTagName("input")[0].getAttributeNode("value")
  43. .nodeValue
  44. );
  45. //value属性的值
  46. console.log(document.getElementsByTagName("input")[0].value);
  47. // 3. 创建节点
  48. //创建元素节点
  49. var li = document.createElement("li");
  50. console.log(li);
  51. //创建文本节点
  52. var text = document.createTextNode("列表项5");
  53. console.log(text);
  54. //创建属性节点
  55. var att = document.createAttribute("style");
  56. att.nodeValue = "color:red";
  57. console.log(att);
  58. // 4. 增加子节点
  59. //增加文本节点
  60. li.appendChild(text);
  61. console.log(li);
  62. var ol = document.querySelector(".u");
  63. //增加子节点
  64. ol.appendChild(li);
  65. //增加属性节点
  66. ol.attributes.setNamedItem(att);
  67. // 5. 插入子节点
  68. var li1 = document.createElement("li");
  69. var text1 = document.createTextNode("列表项6");
  70. li1.appendChild(text1);
  71. ol.insertBefore(li1, ol.childNodes[2]);
  72. console.log(ol);
  73. // 6. 删除节点
  74. //删除子节点
  75. ol.removeChild(ol.childNodes[1]);
  76. //删除属性节点
  77. ol.removeAttributeNode(att);
  78. // 7. 修改节点的值
  79. document.getElementsByTagName("input")[0].value = "修改";
  80. // 8. 替换/更新节点
  81. var li2 = document.createElement("li");
  82. var text2 = document.createTextNode("列表项7");
  83. li2.appendChild(text2);
  84. ol.replaceChild(li2, ol.children[0]);
  85. console.log(ol.children);
  86. // 9. 查询是否含有子节点
  87. console.log(ol.hasChildNodes());
  88. //获取子元素
  89. console.log(document.getElementsByTagName("ol")[0].children);
  90. //获取属性节点的值
  91. console.log(
  92. document.getElementsByTagName("input")[0].getAttribute("value")
  93. );
  94. // 3. 创建节点
  95. //创建元素节点
  96. var li = document.createElement("li");
  97. console.log(li);
  98. </script>
  99. </body>
  100. </html>

3. NodeList和HTMLCollection的区别

  • 相同点:都是类数组,都可以通过索引获取元素,索引从0开始,都有length属性

  • 不同点:

  1. 1. 获取方法不同。前者通过querySelectorAll获取的文档节点,后者通过类名和标签获取的HTML元素
  2. 2. 获取节点元素方法不同。前者只能通过索引获取,后者还可通过name和id(namedItem()方法)获取
  3. 3. 前者包含所有的节点类型,后者只包含元素节点

4. DOMTokenList(元素类名列表)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <ul class="u">
  10. <li class="uli">列表项1</li>
  11. <li class="uli">列表项2</li>
  12. <li class="uli">列表项3</li>
  13. <li class="uli">列表项4</li>
  14. </ul>
  15. <ol class="o">
  16. <li class="oli">列表项1</li>
  17. <li class="oli">列表项2</li>
  18. <li class="oli">列表项3</li>
  19. <li class="oli">列表项4</li>
  20. </ol>
  21. </body>
  22. <script>
  23. //获取类名
  24. console.log(document.getElementsByClassName("u")[0].className);
  25. //获取classList对象
  26. console.log(document.getElementsByClassName("u")[0].classList);
  27. //增加类名
  28. document.getElementsByClassName("u")[0].classList.add("u01");
  29. //删除类名
  30. document.getElementsByClassName("u")[0].classList.remove("u01");
  31. //修改类名
  32. document.getElementsByClassName("u")[0].classList.replace("u", "u01");
  33. </script>
  34. </html>

二、事件处理

1. 添加事件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <button onclick="alert('hello')">按钮1</button>
  10. <button>按钮2</button>
  11. <button>按钮3</button>
  12. <div class="d1">
  13. <div class="d2">
  14. <div class="d3"></div>
  15. </div>
  16. </div>
  17. </body>
  18. <script>
  19. //添加事件方式1:给html元素绑定事件属性
  20. //添加事件方式2:给html元素添加事件属性
  21. var bth2 = document.querySelectorAll("button")[1];
  22. bth2.onclick = function () {
  23. alert(this.nodeName);
  24. };
  25. //添加事件方式3:监听html元素
  26. var bth3 = document.querySelectorAll("button")[2];
  27. bth3.addEventListener(
  28. "click",
  29. function () {
  30. alert("world");
  31. },
  32. false
  33. );
  34. </script>
  35. </html>

2. 事件派发

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <button>按钮</button>
  10. </body>
  11. <script>
  12. var bth = document.querySelector("button");
  13. bth.addEventListener(
  14. "click",
  15. function () {
  16. alert("hello");
  17. },
  18. false
  19. );
  20. //创建一个事件
  21. var ev = new Event("click");
  22. //向一个目标派发一个事件
  23. bth.dispatchEvent(ev);
  24. </script>
  25. </html>

3. 事件传递(捕获)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <div class="d1">
  10. <div class="d2">
  11. <div class="d3">
  12. <button>按钮</button>
  13. <div class="d4">
  14. <div class="d5"></div>
  15. </div>
  16. </div>
  17. </div>
  18. </body>
  19. <script>
  20. var d1 = document.getElementsByClassName("d1")[0];
  21. var d2 = document.getElementsByClassName("d2")[0];
  22. var d3 = document.getElementsByClassName("d3")[0];
  23. var d4 = document.getElementsByClassName("d4")[0];
  24. var d5 = document.getElementsByClassName("d5")[0];
  25. //事件捕获
  26. d1.addEventListener(
  27. "click",
  28. function (ev) { console.log('d1') },
  29. true
  30. );
  31. d2.addEventListener(
  32. "click",
  33. function (ev) { console.log('d2') },
  34. true
  35. );
  36. d3.addEventListener(
  37. "click",
  38. function (ev) { console.log('d3') },
  39. true
  40. );
  41. d4.addEventListener(
  42. "click",
  43. function (ev) { console.log('d4') },
  44. true
  45. );
  46. d5.addEventListener(
  47. "click",
  48. function (ev) { console.log('d5') },
  49. true
  50. );
  51. </script>
  52. </html>

4. 事件传递(冒泡)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <div class="d1">
  10. <div class="d2">
  11. <div class="d3">
  12. <button>按钮</button>
  13. <div class="d4">
  14. <div class="d5"></div>
  15. </div>
  16. </div>
  17. </div>
  18. </body>
  19. <script>
  20. var d1 = document.getElementsByClassName("d1")[0];
  21. var d2 = document.getElementsByClassName("d2")[0];
  22. var d3 = document.getElementsByClassName("d3")[0];
  23. var d4 = document.getElementsByClassName("d4")[0];
  24. var d5 = document.getElementsByClassName("d5")[0];
  25. //事件冒泡
  26. d1.addEventListener(
  27. "click",
  28. function (ev) { console.log('d1') },
  29. false
  30. );
  31. d2.addEventListener(
  32. "click",
  33. function (ev) { console.log('d2') },
  34. false
  35. );
  36. d3.addEventListener(
  37. "click",
  38. function (ev) { console.log('d3') },
  39. false
  40. );
  41. d4.addEventListener(
  42. "click",
  43. function (ev) { console.log('d4') },
  44. false
  45. );
  46. d5.addEventListener(
  47. "click",
  48. function (ev) { console.log('d5') },
  49. false
  50. );
  51. </script>
  52. </html>

4. 事件委托

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>1</li>
  11. <li>2</li>
  12. <li>3</li>
  13. <li>4</li>
  14. <li>5</li>
  15. </ul>
  16. </body>
  17. <script>
  18. //子元素上的事件会冒泡到父元素上的同名事件上触发
  19. document.querySelector("ul").addEventListener("click", function (ev) {
  20. console.log(ev.target);
  21. });
  22. </script>
  23. </html>

四、课程总结

  • 今天学习了 JavaScript 的DOM操作和事件处理,通过上课认真听讲和认真完成老师布置的作业,使得我对 DOM和事件 的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了操作DOM和事件处理的特点以及基本用法。
上一条:前端 - JS - 实战案例下一条:Flex布局
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议