Javascript 事件

本文深入讲解了事件处理机制,包括事件源、事件名、事件注册和事件处理的概念,并通过实例详细解析了各种常见鼠标和键盘事件,如单击、双击、键盘按下等。此外还介绍了事件的注册方法及捕获与冒泡过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件

  1. 事件源
  2. 事件名
  3. 事件注册
  4. 事件处理

以火灾为例

粤商大酒店201房间发生火灾,119电话报警,南湖区消防支队出警,赶赴现场通过喷水作业成功灭火。

事件源:粤商大酒店201房间

事件名:火灾

事件注册:事先已经规划好片区,粤商大酒店所属片区归南湖区消防支队负责

事件处理:喷水

常用事件

 鼠标常用事件:

(1)单击事件

  1. <body>

  2. <p id="p1" onclick="fun()">单击事件测试</p>

  3. </body>
  1. <script>

  2.     function fun(){

  3.         //获取到指定元素

  4.         var p1 = document.getElementById("p1");

  5.         p1.innerText = "我被单击了!";

  6.         p1.style.fontSize ="60px";

  7.     }
  8. </script>

在这个案例中,事件源就是id为“p1”的元素,事件名是单击,事件注册是onclick="fun()",也就是说当单击id为“p1”的元素时,就交由fun函数来处理。

(2)双击事件

  1. <head>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3.     <title></title>
  4.     <style type="text/css">
  5.         #div1{
  6.             width:100px;
  7.             height:100px;
  8.             background-color:skyblue;
  9.         }
  10.     </style>
  11. </head>
  12. <body>
  13.     <div id="div1" onclick="zoomout()" ondblclick="zoomin()">
  14.     </div>
  15. </body>
  16. <script>
  17.     function zoomout(){
  18.         var div1 = document.getElementById("div1");
  19.         div1.style.width = "200px";
  20.         div1.style.height = "200px";
  21.     }
  22.     function zoomin(){
  23.         var div1 = document.getElementById("div1");
  24.         div1.style.width = "100px";
  25.         div1.style.height = "100px";
  26.     }
  27. </script>
  28. </html>
  29. (3)鼠标按下/弹起(onmousedown onmouseup)
  30. <head>
  31.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  32.     <title></title>
  33.     <style type="text/css">
  34.         #div1{
  35.             width:100px;
  36.             height:100px;
  37.             background-color:skyblue;
  38.         }
  39.     </style>
  40. </head>
  41. <body>
  42.     <div id="div1" onmousedown="zoomout()" onmouseup="zoomin()">
  43.     </div>
  44. </body>
  45. <script>
  46.     function zoomout(){
  47.         var div1 = document.getElementById("div1");
  48.         div1.style.width = "200px";
  49.         div1.style.height = "200px";
  50.     }
  51.     function zoomin(){
  52.         var div1 = document.getElementById("div1");
  53.         div1.style.width = "100px";
  54.         div1.style.height = "100px";
  55.     }
  56. </script>
(4)鼠标移入/离开 onmouseenter onmouseleave
  1. <head>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3.     <title></title>
  4.     <style type="text/css">
  5.         #div1{
  6.             width:100px;
  7.             height:100px;
  8.             background-color:skyblue;
  9.         }
  10.     </style>
  11. </head>
  12. <body>
  13.     <div id="div1" onmouseenter="red()" onmouseleave="blue()">
  14.     </div>
  15. </body>
  16. <script>
  17.     function red(){
  18.         var div1 = document.getElementById("div1");
  19.         div1.style.backgroundColor ="red";
  20.     }
  21.     function blue(){
  22.         var div1 = document.getElementById("div1");
  23.         div1.style.backgroundColor ="skyblue";
  24.     }
  25. </script>
  26. </html>
(5)onmouseover onmouseout
与onmouseenter、onmouseleave很类似。
(6)鼠标移动 onmousemove

  1. <head>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3.     <title></title>
  4.     <style type="text/css">
  5.         #div1{
  6.             width:300px;
  7.             height:300px;
  8.             background-color:skyblue;
  9.         }
  10.         #img1{
  11.             position:absolute;
  12.             top:0px;
  13.             left:0px;
  14.         }
  15.     </style>
  16. </head>
  17. <body>
  18.     <div id="div1" onmousemove="move(event)">
  19.     </div>
  20.     <img id="img1" src="man.png">
  21.     鼠标的坐标<p id="p1"></p>
  22. </body>
  23.     <script>
  24.         functionmove(e){
  25.             var p1 = document.getElementById("p1");
  26.             var img1 = document.getElementById("img1");
  27.             p1.innerText = e.clientX+","+ e.clientY;
  28.             img1.style.top = e.clientY+"px";
  29.             img1.style.left = e.clientX+"px";
  30.         }
  31.     </script>
  32. </html>
(7)onmousewheel
  1. <head>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3.     <title></title>
  4.     <style type="text/css">
  5.         #div1{
  6.             width:100px;
  7.             height:100px;
  8.             background-color:skyblue;
  9.         }
  10.     </style>
  11. </head>
  12. <body>
  13.     <div id="div1" onmousewheel="wheel(event)">

  14.     </div>
  15. </body>
  16.     <script>
  17.         var width = 100;
  18.         var height = 100;
  19.         functionwheel(e){
  20.             if(e.wheelDelta > 0){
  21.                 width += 5;
  22.                 height += 5;
  23.             }else{
  24.                 width -= 5;
  25.                 height -= 5;
  26.             }
  27.             var div1 = document.getElementById("div1");
  28.             div1.style.width = width+"px";
  29.             div1.style.height = height+"px";
  30.         }
  31.     </script>
  32. </html>
  33.  
键盘事件
(1)keypress

  1. function search(e){
  2.     if(e.keyCode == 13){
  3.         var what = document.getElementById("what");
  4.         alert("开始搜索:"+what.value);
  5.     }
  6. }
keyCode属性记录了按下的键的编码。
keypress事件只能捕获可打印字符的按键,不能捕获诸如shift、ctrl、alt等不可打印字符的按键。
但是可以通过shiftkey、ctrlkey等属性判断在击键的同时是否按下了shift、ctrl等辅助键。
(2)keydown、keyup
  1. <body>
  2.     <input id="what" type="text" onkeydown="keydown(event)">
  3. </body>
  4. <script>
  5.     function keydown(e){
  6.         alert(e.keyCode);
  7.     }
  8. </script>
  9. keydown、keyup可以捕获键盘上所有的键(个别除外)。
  10. <head>
  11.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  12.     <title></title>
  13.     <style type="text/css">
  14.         #img1{
  15.             position:absolute;
  16.             top:0px;
  17.             left:0px;
  18.         }
  19.     </style>
  20. </head>
  21. <body onkeydown="move(event)">
  22.     <img id="img1" src="man.png">
  23. </body>
  24.     <script>
  25.         var top1 = 0;
  26.         var left = 0;
  27.         functionmove(e){
  28.             switch(e.keyCode){
  29.                 case37:left -=5; break;
  30.                 case38:top1 -=5; break;
  31.                 case39:left +=5; break;
  32.                 case40:top1 +=5; break;
  33.             }

  34.             var img1 = document.getElementById("img1");
  35.             img1.style.top = top1+"px";
  36.             img1.style.left = left+"px";
  37.         }
  38.     </script>
  39. </html>
总结:
(1)使用变量top导致上下移动失败,原因是和window.top这个全局变量冲突了,换个变量名就好了。
(2)如果把变量top1和left移入函数中,发现只能移动5像素。原因是函数内部的局部变量在每次调用函数时都会重新创建并初始化,也就是说每一次调用left和top1的值都是0,不会保留上一次的值。如果需要保留,就只能用全局变量了。
 
其它事件:
onload:页面加载事件
onfocus:获得焦点的事件
onblur:失去焦点事件
onchange:值改变事件
事件的注册
三种方法:
(1)使用onXXX属性,比如onclick="fun()"
(2)通过js去设置元素的onXXX属性
(3)通过addEventListener注册
  1. <body>
  2.     <input type="text" id="txt1" onfocus="focus1()">
  3. </body>
  4. <script>
  5.     var txt1 = document.getElementById("txt1");
  6.     //注册事件的第二种方法
  7.     txt1
  8.     txt1
  9.     txt1.onblur = blur2;
  10.     //注册事件的第三种方法
  11.     txt1
  12.     txt1
  13.     txt1.addEventListener("change",function (){
  14.         alert("值改变了");
  15.     });
  16.     function focus1(){
  17.         txt1.style.backgroundColor= "blue";
  18.     }
  19.     function blur2(){
  20.         var txt1 = document.getElementById("txt1");
  21.         txt1.style.backgroundColor= "gray";
  22.     }
  23. </script>
 
后两种方法有何好处?将页面的内容、样式和行为分离,内容和样式可能是美工人员去完成,行为(实际上就是JS的内容)往往是程序员的事。分离后利于分工合作。
第三种方式addEventListener的第一个参数事件名,第二个参数是事件处理函数。可以添加事件监听,当然也就可以移除,用的是removeEventListener,参数与addEventListener参数是一样的。
而且通过addEventListener和removeEventListener甚至我们可以去动态地去注册不同的事件处理程序。
捕获与冒泡
 
  1. <body>
  2.     <div id="div1">
  3.         <p id="p1">捕获和冒泡的演示</p>
  4.     </div>
  5. </body>
  6. <script>
  7.     var div1 = document.getElementById("div1");
  8.     var p1 = document.getElementById("p1");
  9.     p1.addEventListener("click",click1);
  10.     div1.addEventListener("click",click2);

  11.     function click1(){
  12.         alert("段落被单击了");
  13.     }
  14.     function click2(){
  15.         alert("div被单击了");
  16.     }
  17. </script>
  18. </html>
在这个案例中,如果单击文字,先提示“段落被单击”,然后再提示“div被单击”。因为div是段落的父容器,所以单击段落也就单击了div,所以两者都会触发这个事件。
但是如何去规定两个事件的处理顺序呢?这就是事件的冒泡和捕获。
冒泡:按照从内到外的顺序依次触发,默认方式;
捕获:反之
 
  1. <head>
  2.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  3.     <title></title>
  4.     <style>
  5.         div{
  6.             border:1px solid blue;
  7.         }
  8.         #div2{
  9.             width:100px;
  10.             height:100px;
  11.             background-color:skyblue;
  12.             margin:10px;
  13.         }
  14.     </style>
  15. </head>
  16. <body>
  17.     <div id="div1">
  18.         <div id="div2">

  19.         </div>
  20.     </div>
  21. </body>
  22. <script>
  23.     var div1 = document.getElementById("div1");
  24.     var div2 = document.getElementById("div2");
  25.     /*div1.onmouseenter= enter1;
  26.     div2.onmouseenter = enter2;*/
  27.     div1
  28.     div2.onmouseenter = enter2;*/
  29.     div1
  30.     div2.onmouseenter = enter2;*/
  31.     div1.onmouseover= enter1;
  32.     div2.onmouseover= enter2;
  33.     function enter1(){
  34.         alert("进入div1");
  35.     }
  36.     function enter2(){
  37.         alert("进入div2");
  38.     }
  39. </script>
当使用mouseenter事件时,当里层的div触发进入事件时,处理完了就完事了(阻断冒泡);而使用mouseover事件时,当里层的div触发进入事件时,处理完了还会冒泡给父容器处理进入事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LDH-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值