博客列表 >JS - DOM 操作与事件

JS - DOM 操作与事件

晴天
晴天原创
2020年05月27日 11:45:10964浏览

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