Blogger Information
Blog 47
fans 1
comment 0
visits 53021
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS - DOM 操作与事件
晴天
Original
974 people have browsed it

JS - DOM 操作与事件

1. DOM 操作

1.1 DOM 对象

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

  • 节点树:这些节点按照一定的结构组成的树形的结构 也叫 DOM 树

  • 节点类型:元素,文本,属性,注释,文档节点

语句 描述 结果
document.doctype 访问文档类型 <!doctyhpe html>
document.documentElement 访问 html 文档 <html>....</html>
document.head 访问 Head 标签 <head>...</head>
document.body 访问 body <body>...</body>
document.title 访问 title <title>DOM</title>
document.forms 拿到页面中的所有表单 HTMLCollection(3) [form, form, form]
document.forms[0] 拿到第一个 <form action="1.php"></form>
document.forms.item(0) 另一种方式 <form action="1.php"></form>
document.getElementById("login") 通过 id 的方式访问 <form action="2.php" id="login"></form>
document.forms.namedItem("logout") 通过 name 访问 <form action="3.php" name="logout"></form>
document.forms.namedItem("login") 也可以访问 id <form action="2.php" id="login"></form>
document.forms.namedItem("register").username.value 获取到第四个 form 中 input 的值 admin
document.forms[3].username.value 获取到第四个 form 中 input 的值另一种方式 admin
  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>DOM</title>
  7. </head>
  8. <body>
  9. <form action="1.php"></form>
  10. <form action="2.php" id="login"></form>
  11. <form action="3.php" name="logout"></form>
  12. <form action="4.php" name="register">
  13. <input type="text" name="username" value="admin" />
  14. </form>
  15. <script>
  16. // 先将console.log()简化一下
  17. var cl = console.log;
  18. // 访问文档类型
  19. cl(document.doctype);
  20. // <!doctyhpe html>
  21. // 访问html文档
  22. cl(document.documentElement);
  23. // <html>....</html>
  24. // 访问 Head 标签
  25. cl(document.head);
  26. // <head>...</head>
  27. // 访问body
  28. cl(document.body);
  29. // 访问 title
  30. cl(document.title);
  31. // 拿到页面中的所有表单
  32. cl(document.forms);
  33. // HTMLCollection(3) [form, form, form] 返回为html的集合 他是一个类数组,像数组
  34. // 比如拿到第一个 索引从0开始
  35. cl(document.forms[0]);
  36. // <form action="1.php"></form>
  37. // 还有一种方式
  38. cl(document.forms.item(0)); //返回与上面相同
  39. // 当然 我们也可以通过id的方式访问
  40. cl(document.getElementById("login"));
  41. // <form action="2.php" id="login"></form>
  42. // 通过name访问
  43. cl(document.forms.namedItem("logout"));
  44. // <form action="3.php" name="logout"></form>
  45. // 这种方式也可以访问id
  46. cl(document.forms.namedItem("login"));
  47. // <form action="2.php" id="login"></form>
  48. // 要获取到第四个form中input的值
  49. cl(document.forms.namedItem("register").username.value);
  50. // admin
  51. // l另一种方式
  52. cl(document.forms[3].username.value);
  53. // admin
  54. </script>
  55. </body>
  56. </html>

1.2 获取 DOM 元素

获取方式 描述
document.getElementsByTagName("li") 通过标签获取
document.getElementById("list") 通过 id 获取
document.getElementsByName("first") 通过 name 获取
document.getElementsByClassName("item active") 通过 class 获取
document.querySelector("ul > li:last-of-type") 通过 css 选择器获取
  1. <body>
  2. <ul id="list">
  3. <li class="item" name="first">item1</li>
  4. <li class="item">item2</li>
  5. <li class="item">item3</li>
  6. <li class="item active">item4</li>
  7. <li class="item">item5</li>
  8. </ul>
  9. </body>
  10. <script>
  11. var cl = console.log;
  12. // 通过标签获取
  13. cl(document.getElementsByTagName("li"));
  14. // HTMLCollection(5) [li.item, li.item, li.item, li.item.active, li.item, first: li.item]
  15. // 获得一个类数组 键名从0开始的正整数 有一个length 属性 表示数量
  16. // 通过id获取
  17. cl(document.getElementById("list"));
  18. // <ul id="list">...<ul>
  19. // 通过class获取
  20. cl(document.getElementsByClassName("item active"));
  21. // HTMLCollection [li.item.active]
  22. // 通过 name 获取
  23. cl(document.getElementsByName("first"));
  24. // NodeList [li.item]
  25. // 通过css选择器获取
  26. cl(document.querySelector("ul > li:last-of-type"));
  27. // <li class="item">item5</li>
  28. </script>

1.3 遍历元素节点

  • JS 节点有 11 种类型,但与 HTML 相关的只有 6 个
编号 节点名称
1 元素
2 属性
3 文本
6 注释
9 文档,document
11 文档片段

1.3.1 childNodes 返回所有节点

v

  1. <body>
  2. <ul>
  3. <li>item1</li>
  4. <li>item2</li>
  5. <li>item3</li>
  6. <li>item4</li>
  7. <li>item5</li>
  8. </ul>
  9. </body>
  10. <script>
  11. var cl = console.log;
  12. var ul = document.querySelector("ul");
  13. // 获取所有元素节点 这其中包括标签后面的换行符
  14. cl(ul.childNodes);
  15. // NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
  16. // 获取节点长度
  17. cl(ul.childNodes.length); // 11
  18. // 拿到第二个节点
  19. cl(ul.childNodes[1]); // <li>item1</li>
  20. // 查看节点类型
  21. cl(ul.childNodes[1].nodeType); // 1 = 元素节点
  22. //查看元素名称
  23. cl(ul.childNodes[1].nodeName);
  24. // 遍历
  25. var eles = [];
  26. ul.childNodes.forEach(function (item) {
  27. // 如果节点类型为元素 push到数组中
  28. if (item.nodeType === 1) {
  29. this.push(item);
  30. }
  31. }, eles);
  32. cl(eles);
  33. // [li, li, li, li, li]
  34. // 获取第一个节点
  35. cl(ul.firstChild); //#text
  36. // 获取最后一个节点
  37. cl(ul.lastChild); //#text
  38. // 前一个兄弟节点
  39. cl(ul.lastChild.previousSibling);
  40. // <li>item5</li>
  41. // 后一个兄弟节点
  42. cl(ul.firstChild.nextSibling);
  43. // <li>item1</li>
  44. </script>

1.3.2 children 只返回元素

  • 获取方式
获取方式 描述
ul.children 获取所有元素
ul.children.length 获取长度
ul.childElementCount 获取长度
ul.firstElementChild 获取第一个元素
ul.lastElementChild 获取最后一个元素
ul.children[2] 获取任何一个
ul.children[2].previousElementSibling 前一个兄弟
ul.children[3].nextElementSibling 后一个兄弟
  1. <body>
  2. <ul>
  3. <li>item1</li>
  4. <li>item2</li>
  5. <li>item3</li>
  6. <li>item4</li>
  7. <li>item5</li>
  8. </ul>
  9. </body>
  10. <script>
  11. var cl = console.log;
  12. var ul = document.querySelector("ul");
  13. // 获取元素
  14. cl(ul.children);
  15. // HTMLCollection(5) [li, li, li, li, li]
  16. // 获取长度
  17. cl(ul.children.length); // 5
  18. cl(ul.childElementCount); // 5
  19. // 获取第一个元素
  20. cl(ul.firstElementChild);
  21. // <li>item1</li>
  22. // 获取最后一个元素
  23. cl(ul.lastElementChild);
  24. // <li>item5</li>
  25. // 获取任何一个
  26. cl(ul.children[2]);
  27. // <li>item3</li>
  28. // 前一个兄弟
  29. cl(ul.children[2].previousElementSibling);
  30. // <li>item2</li>
  31. //后一个兄弟
  32. cl(ul.children[3].nextElementSibling);
  33. // <li>item5</li>
  34. // 遍历 HTMLCollection中没有foreach 用for
  35. for (var i = 0; i < ul.children.length; i++) {
  36. cl(ul.children[i]);
  37. }
  38. </script>

1.4 classList 对象

语句 描述
h3.classList.add("red"); 添加属性值(可多次添加)
h3.classList.remove("red"); 删除指定属性值
h3.classList.toggle("red"); 自动切换(添加/删除)
h3.classList.replace("red", "blue"); 替换属性值
  1. <style>
  2. .red {
  3. color: red;
  4. }
  5. .bgc {
  6. background-color: yellow;
  7. }
  8. .blue {
  9. color: blue;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <p class="red">大家吃了吗?</p>
  15. <h3>classList对象非常棒</h3>
  16. </body>
  17. <script>
  18. var cl = console.log.bind(console);
  19. var p = document.querySelector("p");
  20. // 正常情况下 修改 p的class属性
  21. p.className = "blue"; // 文本变成蓝色
  22. // classlist比classname 强太多
  23. var h3 = document.querySelector("h3");
  24. // 添加
  25. h3.classList.add("red");
  26. h3.classList.add("bgc");
  27. // <h3 class="red bgc">classList对象非常棒</h3>
  28. // 删除
  29. h3.classList.remove("red");
  30. // <h3 class="bgc">classList对象非常棒</h3>
  31. // 自动切换
  32. // 如果标签属性中 有这个值则删除 没有则添加
  33. h3.classList.toggle("red");
  34. // <h3 class="red bgc">classList对象非常棒</h3>
  35. // 修改,将参数1,修改为参数2
  36. h3.classList.replace("red", "blue");
  37. // <h3 class="bgc blue">classList对象非常棒</h3>
  38. </script>

1.5 dataset 对象

  • 用于处理用户自定义的数据属性

  • html5 中可以使用自定义数据属性保存标签的附加信息,data-做为前缀

  1. <body>
  2. <div id="user" data-id="101" data-user-name="admin">用户信息</div>
  3. </body>
  4. <script>
  5. var cl = console.log.bind(console);
  6. var user = document.querySelector("#user");
  7. // dataset 后面的属性就是自定义的属性
  8. cl(user.dataset.id); // 101
  9. // data有多个连接线的 去掉连接线并将连接线后面的第一个字母大写
  10. cl(user.dataset.userName); //admin
  11. // 修改 原data值
  12. user.dataset.id = "202";
  13. cl(user.dataset.id); // 输出 202
  14. user.dataset.userName = "peter";
  15. cl(user.dataset.userName); // 输出 peter
  16. </script>

2. 事件

2.1 事件添加方式

2.1.1 直接加入元素属性中

  1. <button onclick="var text=this.innerText;alert(text);">按钮1</button>
  2. <!-- 弹出对话框 -->

2.1.2 给元素绑定事件属性

  1. <button onclick="show(this)">按钮2</button>
  2. <script>
  3. function show(ele) {
  4. var text = ele.innerText;
  5. alert(text);
  6. }
  7. </script>

2.1.3 给元素添加属性

  1. <button>按钮3</button>
  2. <script>
  3. var btn3 = document.querySelector("button:nth-of-type(3)");
  4. btn3.onclick = function () {
  5. alert(this.nodeName);
  6. };
  7. </script>

2.1.4 监听器

  1. <button>按钮4</button>
  2. <script>
  3. var btn4 = document.querySelector("button:nth-of-type(4)");
  4. btn4.addEventListener(
  5. "click",
  6. function () {
  7. alert(this.innerText);
  8. },
  9. false
  10. );
  11. </script>

2.1.5 事件派发

  1. <button>按钮5</button>
  2. <script>
  3. var btn5 = document.querySelector("button:nth-of-type(5)");
  4. btn5.addEventListener(
  5. "click",
  6. function () {
  7. alert(this.innerText);
  8. },
  9. false
  10. );
  11. // 创建一个事件对象
  12. var ev = new Event("click");
  13. // 不用点击 自动触发
  14. btn5.dispatchEvent(ev);
  15. </script>

2.2 事件传递 与 事件委托/代理

  1. <body>
  2. <div class="first">
  3. <div class="second">
  4. <div class="three">事件触发</div>
  5. </div>
  6. </div>
  7. </body>
  8. <script>
  9. var first = document.querySelector(".first");
  10. var second = document.querySelector(".second");
  11. var three = document.querySelector(".three");
  12. cl = console.log;
  13. // true 捕获阶段
  14. first.addEventListener(
  15. "click",
  16. function (ev) {
  17. // ev: 唯一的事件对象
  18. // ev.type 获取事件类型
  19. // ev.target 获取触发事件的元素
  20. // ev.currentTarget 获取绑定事件的元素 也就是自己
  21. // ev.target.classList.item(0) 获取触发事件的class值
  22. // 看一下触发与绑定
  23. cl(
  24. "捕获阶段:" + "触发: " + ev.target.classList.item(0),
  25. "绑定:" + ev.currentTarget.classList.item(0)
  26. );
  27. },
  28. true
  29. );
  30. second.addEventListener(
  31. "click",
  32. function (ev) {
  33. cl(
  34. "捕获阶段:" + "触发: " + ev.target.classList.item(0),
  35. "绑定:" + ev.currentTarget.classList.item(0)
  36. );
  37. },
  38. true
  39. );
  40. three.addEventListener(
  41. "click",
  42. function (ev) {
  43. cl(
  44. "捕获阶段:" + "触发: " + ev.target.classList.item(0),
  45. "绑定:" + ev.currentTarget.classList.item(0)
  46. );
  47. },
  48. true
  49. );
  50. // 冒泡阶段
  51. first.addEventListener(
  52. "click",
  53. function (ev) {
  54. cl(
  55. "冒泡阶段:" + "触发: " + ev.target.classList.item(0),
  56. "绑定:" + ev.currentTarget.classList.item(0)
  57. );
  58. },
  59. false
  60. );
  61. second.addEventListener(
  62. "click",
  63. function (ev) {
  64. cl(
  65. "捕获阶段:" + "触发: " + ev.target.classList.item(0),
  66. "绑定:" + ev.currentTarget.classList.item(0)
  67. );
  68. },
  69. false
  70. );
  71. three.addEventListener(
  72. "click",
  73. function (ev) {
  74. cl(
  75. "捕获阶段:" + "触发: " + ev.target.classList.item(0),
  76. "绑定:" + ev.currentTarget.classList.item(0)
  77. );
  78. },
  79. false
  80. );
  81. </script>

3. 总结

  • 获取 DOM 元素使用document.querySellecter最为方便

  • 遍历元素节点

    • childNodes返回所有节点 Nodelist 使用forEach 遍历
    • children返回元素节点 HTMLCollection 使用for遍历
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:js中的请多知识点, 并无明显规律, 只能强记, 做得多才可以记住
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post