Blogger Information
Blog 36
fans 0
comment 0
visits 28109
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
DOM操作
phpcn_u202398
Original
560 people have browsed it

1、NodeList

  • NodeList是一个节点的集合(既可以包含元素和其他节点),在DOM中,节点的类型总共有12种,通过判断节点的nodeType来判断节点的类型。
  • NodeList对象有个length属性和item()方法,length表示所获得的NodeList对象的节点个数,这里还是要强调的是节点,而item()可以传入一个索引来访问Nodelist中相应索引的元素。
1.1、与html有关的6个节点类型
类型名称 常数值
元素节点 1
属性节点 2
文本节点 3
实体名称节点 6
文档节点 9
文档片段节点 11
代码示例
  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 id="list">
  10. <li class="item" name="first">item1</li>
  11. <li class="item" name="first">item2</li>
  12. <li class="item" name="first">item3</li>
  13. <li class="item" name="first">item4</li>
  14. <li class="item" name="first">item5</li>
  15. <li class="item" name="first">item6</li>
  16. </ul>
  17. </body>
  18. </html>
  19. <script>
  20. var lg = console.log.bind(console);
  21. var ul = document.querySelector("ul");
  22. lg(ul);
  23. //子节点
  24. lg(ul.childNodes);
  25. lg(ul.childNodes.length);
  26. lg(ul.childNodes[3]);
  27. //遍历
  28. var eles = [];
  29. ul.childNodes.forEach(function(item){
  30. if(item.nodeType === 1) this.push(item);
  31. },eles)
  32. lg(eles);
  33. //获取第一个子节点
  34. lg(ul.firstChild);
  35. //获取下一个子节点
  36. lg(ul.firstChild.nextSibling);
  37. //获取最后一个子节点
  38. lg(ul.lastChild);
  39. //获取前一个子节点
  40. lg(ul.lastChild.previousSibling);
  41. </script>

2、HTMLCollection

  • HTMLCollection是元素集合,它和NodeList很像,有length属性来表示HTMLCollection对象的长度,也可以通过elements.item()传入元素索引来访问。
  • HTMLCollection的集合和NodeList对象一样也是动态的,他们获取的都是节点或元素集合的一个引用。
代码示例
  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 id="list">
  10. <li class="item" name="first">item1</li>
  11. <li class="item" name="first">item2</li>
  12. <li class="item" name="first">item3</li>
  13. <li class="item" name="first">item4</li>
  14. <li class="item" name="first">item5</li>
  15. <li class="item" name="first">item6</li>
  16. </ul>
  17. </body>
  18. </html>
  19. <script>
  20. var lg = console.log.bind(console);
  21. var ul = document.querySelector("ul");
  22. lg(ul.children);
  23. lg(ul.children.length);
  24. lg(ul.childElementCount);
  25. //第一个元素
  26. lg(ul.firstElementChild);
  27. //最后一个元素
  28. lg(ul.lastElementChild);
  29. lg(ul.children[3]);
  30. //前一个
  31. lg(ul.children[3].previousElementSibling);
  32. //下一个
  33. lg(ul.children[3].nextElementSibling);
  34. lg("-------------------------");
  35. //遍历
  36. for(var i = 0;i<ul.childElementCount;i++){
  37. lg(ul.children.item(i));
  38. }
  39. </script>

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. <button onclick="show(this)">按钮</button>
  10. <button>按钮1</button>
  11. <button>按钮2</button>
  12. </body>
  13. </html>
  14. <script>
  15. //给html元素绑定事件属性
  16. function show(ele){
  17. var text = ele.innerText;
  18. alert(text);
  19. }
  20. //监听器
  21. var btn = document.querySelector("button:first-of-type");
  22. btn.addEventListener("click",function(){
  23. alert(this.innerText);
  24. },
  25. false //false为冒泡排序
  26. );
  27. //事件派发
  28. var btn1 = document.querySelector("button:nth-of-type(3)");
  29. btn1.addEventListener("click",function(){
  30. alert(this.innerText);
  31. },
  32. false //false为冒泡排序
  33. );
  34. //创建一个事件对象
  35. var ev = new Event("click");
  36. btn1.dispatchEvent(ev);
  37. </script>

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="first">
  10. <div class="second">
  11. <div class="three">事件传递</div>
  12. </div>
  13. </div>
  14. <script>
  15. //事件的捕获与冒泡
  16. var lg = console.log.bind(console);
  17. var first = document.querySelector(".first");
  18. var second = document.querySelector(".second");
  19. var three = document.querySelector(".three");
  20. //true 捕获阶段触发事件
  21. first.addEventListener("click",function(ev){
  22. //ev:事件对象
  23. // ev.type:事件类型
  24. // ev.target:触发事件的元素
  25. // ev.currentTarget:绑定事件的元素
  26. lg(ev.target.classList.item(0));
  27. lg("捕获阶段:" + "触发:" + ev.target.classList.item(0),
  28. "绑定:" + ev.currentTarget.classList.item(0));
  29. },true);
  30. second.addEventListener("click",function(ev){
  31. lg(ev.target.classList.item(0));
  32. lg("捕获阶段:" + "触发:" + ev.target.classList.item(0),
  33. "绑定:" + ev.currentTarget.classList.item(0));
  34. },true);
  35. three.addEventListener("click",function(ev){
  36. lg(ev.target.classList.item(0));
  37. lg("捕获阶段:" + "触发:" + ev.target.classList.item(0),
  38. "绑定:" + ev.currentTarget.classList.item(0));
  39. },true);
  40. //false 冒泡阶段触发事件
  41. first.addEventListener("click",function(ev){
  42. lg(ev.target.classList.item(0));
  43. lg("冒泡阶段:" + "触发:" + ev.target.classList.item(0),
  44. "绑定:" + ev.currentTarget.classList.item(0));
  45. },false);
  46. second.addEventListener("click",function(ev){
  47. lg(ev.target.classList.item(0));
  48. lg("冒泡阶段:" + "触发:" + ev.target.classList.item(0),
  49. "绑定:" + ev.currentTarget.classList.item(0));
  50. },false);
  51. three.addEventListener("click",function(ev){
  52. lg(ev.target.classList.item(0));
  53. lg("冒泡阶段:" + "触发:" + ev.target.classList.item(0),
  54. "绑定:" + ev.currentTarget.classList.item(0));
  55. },false);
  56. </script>
  57. <!--冒泡实现事件的委托/代理-->
  58. <ul>
  59. <li>item1</li>
  60. <li>item2</li>
  61. <li>item3</li>
  62. <li>item4</li>
  63. <li>item5</li>
  64. </ul>
  65. <script>
  66. //document.querySelectorAll("ul li").forEach(function(item){
  67. // item.addEventListener("click",function(ev){
  68. // lg("当前触发事件的元素:", this);
  69. // });
  70. //});
  71. //事件委托/代理 :子元素上的事件会冒泡到父元素上的同名事件上触发
  72. document.querySelector("ul").addEventListener("click",function(ev){
  73. lg("当前触发事件的元素:",ev.target);
  74. lg("当前绑定事件的元素:",ev.currentTarget);
  75. });
  76. </script>
  77. </body>
  78. </html>

5、事件捕获与冒泡原理

学习总结

本节课我们学习了事件的添加方式与事件的委托/代理,通过本节课的学习使知道了捕获与冒泡的原理,同时学到了事件委托/代理的实现方式。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:事件的传递机制, 理解起来比较抽象, 案例也不太好举, 所以要多写一些小练习, 去悟, 只有在实战中, 才能深刻体会事件机制
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