JS基础-事件对象&&事件的冒泡&&事件的绑定以及事件的传播

快来打我* 2022-03-21 20:10 423阅读 0赞

1.鼠标移动的事件对象

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>练习</title>
  6. <style type="text/css">
  7. #areadiv{
  8. width:300px;
  9. height:100px;
  10. border:1px solid #333;
  11. }
  12. #showdiv{
  13. width:300px;
  14. height:50px;
  15. border:1px solid #333;
  16. margin-top:10px;
  17. }
  18. </style>
  19. <script type="text/javascript">
  20. window.function()
  21. {
  22. //要实现的功能是当鼠标在areadiv中移动时,会在showdiv中显示鼠标的坐标
  23. //第一步,首先获取两个div
  24. var bigdiv=document.getElementById("areadiv");
  25. var smalldiv=document.getElementById("showdiv");
  26. //绑定鼠标移动事件
  27. bigdiv.onmousemove=function(event)
  28. {
  29. //事件对象,当事件的响应函数被触发时,浏览器每次都会将一个事件对象作为实参传递进响应函数,在事件对象中封装了当前事件相关的一切信息,比如,鼠标的坐标,键盘哪个键被按下,鼠标滚轮滚动的方向
  30. //在IE8中,响应函数被触发时,浏览器不会传递事件对象,在IE8及以下的浏览器中,是将事件作为window对象的属性保存的
  31. //clientX可以获取鼠标指针的水平坐标,clientY可以获取鼠标指针的垂直坐标
  32. event=event||window.event;//为了解决事件对象的兼容性
  33. var x=event.clientX;
  34. var y=event.clientY;
  35. //在showdiv中显示坐标
  36. smalldiv.innerHTML="x="+x+","+"y="+y;
  37. };
  38. };
  39. </script>
  40. </head>
  41. <body>
  42. <div id="areadiv"></div>
  43. <div id="showdiv"></div>
  44. </body>
  45. </html>

效果图如下:
效果图
2.div跟随鼠标移动的练习

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>练习</title>
  6. <style type="text/css">
  7. #box1{
  8. width:100px;
  9. height:100px;
  10. background-color:#F00;
  11. position:absolute;/*非常重要,一定要开启绝对定位*/
  12. }
  13. </style>
  14. <script type="text/javascript">
  15. window.function()
  16. {
  17. //要实现的功能是div跟随着鼠标移动
  18. //第一步,首先获取box1
  19. var box=document.getElementById("box1");
  20. //绑定鼠标移动事件(给文档绑定)
  21. document.onmousemove=function(event)
  22. {
  23. //解决浏览器的兼容问题
  24. event=event||window.event;
  25. //获取垂直滚动条滚动的距离
  26. //Chrome认为浏览器的滚动条是body的,可以通过body.scrollTop来获取,火狐等浏览器认为浏览器的滚动条是HTML的
  27. var st=document.body.scrollTop||document.documentElement.scrollTop;
  28. var sl=document.body.scrollLeft||document.documentElement.scrollLeft;
  29. //获取鼠标的坐标
  30. //clientX/clientY用于获取鼠标在当前可见窗口的坐标
  31. //div的偏移量是相对于整个页面的
  32. //pageX/pageY可以获取鼠标相对于整个页面的坐标,但IE8不支持这两个属性
  33. var x=event.clientX;
  34. var y=event.clientY;
  35. //设置div的偏移量
  36. box.style.left=x+sl+"px";
  37. box.style.top=y+st+"px";
  38. };
  39. };
  40. </script>
  41. </head>
  42. <body style="height:1000px;width:1000px">
  43. <div id="box1"></div>
  44. </body>
  45. </html>

3.事件的冒泡:所谓冒泡指的是事件的向上传导,当后代元素上的事件被触发时,其祖先元素的相同事件也会被触发。在开发中大部分冒泡都是有用的,如果不希望事件发生冒泡可以通过事件对象来取消冒泡(取消冒泡,可以将事件对象的cancelBubble设置为true,即可取消冒泡)。下面是冒泡的应用即事件的委派(1.事件的委派:指将事件统一绑定给元素的共同祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件。2.事件的委派利用了冒泡,通过委派可以减少事件的绑定次数,提高程序的性能)

  1. 在这里插入代码片<!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>事件的委派练习</title>
  6. <script type="text/javascript">
  7. //为每一个超链接绑定一个单击响应事件(我们希望只绑定一次,即可应用到多个元素上即使元素是后添加的)
  8. window.function()
  9. {
  10. //获取button事件
  11. var btn=document.getElementById("btn1");
  12. //获取ul事件
  13. var u1=document.getElementById("ul1");
  14. //绑定单击响应事件
  15. btn.onclick=function()
  16. {
  17. //创建li
  18. var li=document.createElement("li");
  19. //向li中添加内容
  20. li.innerHTML="<a href='javascript:;' class='link'>新链接</a>";
  21. //将li添加到ul中
  22. u1.appendChild(li);
  23. };
  24. //为ul绑定一个单击响应事件
  25. u1.onclick=function(event)
  26. {
  27. event=event||window.event;
  28. //target表示触发事件的对象,如果触发事件的对象使我们期望的元素就执行,否则不执行
  29. if(event.target.className=="link")
  30. {
  31. alert("我是ul的单击响应函数");
  32. }
  33. };
  34. };
  35. </script>
  36. </head>
  37. <body>
  38. <button id="btn1">添加新链接</button>
  39. <ul id="ul1" style="background-color:#0F0">
  40. <li><a href="javascript:;" class="link">超链接一</a></li>
  41. <li><a href="javascript:;" class="link">超链接二</a></li>
  42. <li><a href="javascript:;" class="link">超链接三</a></li>
  43. </ul>
  44. </body>
  45. </html>

效果图如下
效果图
3.事件的绑定
绑定单击响应事件的两种方法
第一种方法:使用对象.事件=函数的形式,只能同时为一个元素的一个事件绑定一个响应函数不能绑定多个,若绑定多个则后面的会覆盖前面的
第二种方法,使用addEventListener(),通过这个方法也可以为元素绑定响应函数,参数有三个,第一个参数为,事件的字符串(不要on,如click),第二个参数为,回调函数,当事件被触发时该函数会被调用,第三个参数,是否在捕获阶段触发事件,需要一个布尔值,一般都传false
说明:使用addEventListener()可以同时为一个元素的相同事件绑定多个响应函数,这样当事件被触发时,响应函数将会按照函数的绑定顺序执行,但是此方法不支持IE8及以下浏览器,所有IE8及以下浏览器需要使用attachEvent()方法,这个方法有二个参数,第一个参数,事件的字符串(需要on,如”onclick”),第二个参数,回调函数,这个方法也可以同时为一个元素的相同事件绑定多个响应函数,不同的是它是先绑定后执行,执行顺序和addEventListener()相反

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>事件的绑定练习</title>
  6. <script type="text/javascript">
  7. //点击按钮以后,弹出一个内容
  8. window.function()
  9. {
  10. //获取按钮
  11. var btn=document.getElementById("btn1");
  12. band(btn,"click",function(){alert(1);});
  13. band(btn,"click",function(){alert(2);});
  14. band(btn,"click",function(){alert(3);});
  15. };
  16. //定义一个函数,用来为指定函数绑定响应函数。addEventListener()中的this是绑定事件的对象,attachEvent()中的this是window.参数,obj,要绑定事件的对象,eventstr,事件的字符串,callback,回调函数
  17. function band(obj,eventstr,callback)
  18. {
  19. if(obj.addEventListener)
  20. {
  21. obj.addEventListener(eventstr,callback,false);
  22. }
  23. else
  24. {
  25. //IE8及以下
  26. //this是由调用方式决定的(解决this不一致)
  27. obj.attachEvent("on"+eventstr,function()
  28. {
  29. //在匿名函数中调用回调函数
  30. callback.call(obj);}
  31. );
  32. }
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <button id="btn1">点击一下</button>
  38. </body>
  39. </html>

4.事件的传播
关于事件的传播网景公司和微软公司有不同的理解,微软公司认为事件应该是由内向外传播,也就是当事件被触发时,应该先触发当前元素的事件,然后再向当前元素的祖先元素传播,也就是说事件应该在冒泡阶段执行;网景公司认为事件应该由外向内传播,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素,然后再向内传播给后代元素。W3C综合了两个公司的方案,将事件的传播分为了三个阶段,第一阶段为捕获阶段,在捕获阶段时从最外层的祖先元素向目标元素进行事件的捕获,但是默认不会触发事件。第二阶段为目标阶段,事件捕获到目标元素,捕获结束开始在目标元素上触发事件。第三阶段为冒泡阶段,事件从目标元素向祖先元素传递,依次触发祖先元素上的事件。如果希望在捕获阶段就触发事件,可以将addEventListener()的第三个参数设置为true,但是一般情况下我们不会希望在捕获阶段就触发事件,所有一般情况下addEventListener()的第三个参数为false。IE8以下的浏览器中没有捕获阶段。图解如下:
在这里插入图片描述

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>事件的传播练习</title>
  6. <style type="text/css">
  7. #box1
  8. {
  9. width:300px;
  10. height:300px;
  11. background-color:#0F0;
  12. margin:100px 200px;
  13. }
  14. #box2
  15. {
  16. width:200px;
  17. height:200px;
  18. background-color:#FF0;
  19. }
  20. #box3
  21. {
  22. width:150px;
  23. height:150px;
  24. background-color:#3CF;
  25. }
  26. </style>
  27. <script type="text/javascript">
  28. //为每一个div绑定一个单击响应函数
  29. window.function()
  30. {
  31. //获取三个div
  32. var b1=document.getElementById("box1");
  33. var b2=document.getElementById("box2");
  34. var b3=document.getElementById("box3");
  35. band(b1,"click",function(){alert("我是box1的响应函数");});
  36. band(b2,"click",function(){alert("我是box2的响应函数");});
  37. band(b3,"click",function(){alert("我是box3的响应函数");});
  38. };
  39. function band(obj,eventstr,callback)
  40. {
  41. if(obj.addEventListener)
  42. {
  43. obj.addEventListener(eventstr,callback,false);
  44. }
  45. else
  46. {
  47. obj.attachEvent("on"+eventstr,function()
  48. {
  49. callback.call(obj);
  50. });
  51. }
  52. }
  53. </script>
  54. </head>
  55. <body>
  56. <div id="box1">
  57. <div id="box2">
  58. <div id="box3"></div>
  59. </div>
  60. </div>
  61. </body>
  62. </html>

发表评论

表情:
评论列表 (有 0 条评论,423人围观)

还没有评论,来说两句吧...

相关阅读