05.事件的传播.html 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <style>
  9. #box1 {
  10. width: 300px;
  11. height: 300px;
  12. background-color: yellowgreen;
  13. }
  14. #box2 {
  15. width: 200px;
  16. height: 200px;
  17. background-color: yellow;
  18. }
  19. #box3 {
  20. width: 150px;
  21. height: 150px;
  22. background-color: skyblue;
  23. }
  24. </style>
  25. <script>
  26. window.onload = function () {
  27. /**
  28. * 分别为三个div绑定单击响应函数
  29. */
  30. var box1 = document.getElementById("box1");
  31. var box2 = document.getElementById("box2");
  32. var box3 = document.getElementById("box3");
  33. /**
  34. * 事件的传播
  35. * -关于事件的传播,网景公司和微软公司有不同的理解
  36. * -微软公司认为事件应该是由内向外传播,也就是当事件触发时,
  37. * 应该先触发当前元素上的事件,然后再向当前元素的祖先元素上传播,
  38. * 也就是说事件应该在冒泡阶段执行
  39. * -网景公司认为事件应该是由外向内传播的,也就是说当事件触发时,
  40. * 应该先触发当前元素的最外层的祖先元素的事件,然后再向内传播给
  41. * 后代元素
  42. * -W3C综合了两个公司的方案,将事件传播分成了三个阶段
  43. * 1.捕获阶段
  44. * -在捕获阶段时,从最外层的祖先元素,向目标元素进行事件的捕获,
  45. * 但是默认此时不会触发事件
  46. * 2.目标阶段
  47. * -事件捕获到了目标元素,捕获结束,开始在目标元素上触发事件
  48. * 3.冒泡阶段
  49. * -事件从目标元素向它的祖先元素传递,依次触发祖先元素上的事件
  50. *
  51. * -如果希望在捕获阶段就触发事件,可以将addEventListener()的
  52. * 第三个参数设置为true。
  53. * 一般情况下我们不会希望在捕获阶段触发事件,所以这个参数
  54. * 一般都是false
  55. *
  56. * -IE8及以下的浏览器中没有捕获阶段
  57. */
  58. bind(box1,"click",function(){
  59. alert('box1的响应函数')
  60. });
  61. bind(box2,"click",function(){
  62. alert('box2的响应函数')
  63. });
  64. bind(box3,"click",function(){
  65. alert('box3的响应函数')
  66. });
  67. };
  68. function bind(obj, eventStr, callback) {
  69. if (obj.addEventListener) {
  70. //大部分浏览器兼容的方式
  71. obj.addEventListener(eventStr, callback, false);
  72. } else {
  73. /**
  74. * this是谁由调用方式决定
  75. * callback.call(obj):call方法可以修改this
  76. */
  77. //IE8及以下
  78. obj.attachEvent("on" + eventStr, function () {
  79. //在匿名函数中调用回调函数
  80. callback.call(obj);
  81. });
  82. }
  83. }
  84. </script>
  85. </head>
  86. <body>
  87. <div id="box1">
  88. <div id="box2">
  89. <div id="box3"></div>
  90. </div>
  91. </div>
  92. </body>
  93. </html>