一起深入理解js中的事件对象


Posted in Javascript onFebruary 06, 2021

我们知道在JS中常用的事件有:

  • 页面事件:load;
  • 焦点事件:focus,blur;
  • 鼠标事件:click,mouseout,mouseover,mousemove等;
  • 键盘事件:keydown,keyup,keypress;
  • form表单事件:reset,submit;
  • 内容变化事件:change,input

那JS中“事件对象”,到底是个什么东西?

首先,什么是事件呢?

首先说JS就是为了实现一些动态的操作,而用户会有时候想去实现一些功能,如提交表单,鼠标点击等,就要在浏览器中触发这个事件,然后浏览器会感知(或者说捕获)到用户的这个行为,就会去响应处理这个事件。这个就称之为事件。

那么说,产生事件对象的原因是什么?

事件的触发,大部分情况下是用户想去操作的一种行为,也就是说,我们并不能确定用户什么时间触发;而且,由于事件的传播机制,我们甚至不能确定事件具体触发在哪个节点;这是一件令人很头疼的事情;

为了解决这个问题,在事件发生以后,系统会调用我们写好的事件处理程序(一段代码)来解决。

由此,引出了什么是事件对象?

系统会在调用处理程序时,把有关事件发生的一切信息,封装成一个对象,作为参数,传送给监听函数(事件处理程序)。那么说这个对象,称之为事件对象。

根据事件类型的不同,事件对象中包含的信息也有所不同;如点击事件中,包含鼠标点击的横纵坐标位置,键盘事件中,包含键盘的键值等;

<body>
 <div id="div">
 <p>pppp</p>
 </div>
 <input type="text" value="" id="i">
</body>
<script>
var d = document.getElementById('div');
//鼠标事件
d.addEventListener('click',function(e){
 console.log(e);
});
var i = document.getElementById('i');
//键盘事件
i.addEventListener('keydown',k);
function k(e){
 console.log(e);
}
</script>

一起深入理解js中的事件对象

现在了解了事件对象的含义后,我们来看看事件对象中都有哪些属性和方法?

(1) 普通属性:

event.bubbles: 返回一个布尔值,表示当前事件是否会冒泡;

event.eventPhase:返回一个整数值,表示事件流在传播阶段的位置

0:事件目前没有发生。
1:事件目前处于捕获阶段。
2:事件到达目标节点。
3:事件处于冒泡阶段。

event.type: 返回一个字符串,表示事件类型,大小写敏感;

event.timeStamp: 返回一个毫秒时间戳,表示事件发生的时间;

clientX、clientY : 获取鼠标事件触发的X,Y坐标

事件对象

(2) 事件代理/委托属性:

event.target:对事件触发的引用,返回触发事件发生的那个节点。(重点)

event.currentTarget:返回事件当前所在的节点,即正在执行的监听函数所绑定的那个节点。(了解即可)

var d = document.getElementById('d');
 d.onclick = function(e){
 //返回事件节点
 console.log(e.currentTarget);
 //返回触发节点
 console.log(e.target);
 }

事件代理(事件委托)的含义:由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这个方法叫做事件的代理也叫事件代理或者事件委托。

<head>
 <title></title>
 <meta charset="UTF-8">
 <style>
 div{padding: 40px}
 #div3{width: 300px;height: 300px;border: 1px solid red;}
 #div2{width: 200px;height: 200px;border: 1px solid red;}
 #div1{width: 100px;height: 100px;border: 1px solid red}
 </style>
</head>
<body>
 <div id="div3">div3
 <div id="div2">div2
  <div id="div1">div1</div>
 </div>
 </div>
</body>
<script>
 var d = document.getElementById('div3');
 d.onclick = function(e){
 e.target.style.background = 'red';
 }
</script>

根据上面的代码可以得到三个div的位置大概如下:点击每个div,每个div的整体就会变成红色。主要是通过e.target返回了点击触发的该节点。

一起深入理解js中的事件对象

(3)阻止浏览器默认行为和阻止事件传播的方法event.preventDefault():该方法 阻止浏览器会执行当前事件的默认行为,比如点击链接后,浏览器跳转到指定页面;或者按一下空格键,页面向下滚动一段距离。event.stopPropagation():该方法 阻止事件在DOM结构中继续传播,防止再触发定义在别的节点上的监听函数。

<body>
 <div id="div2">2
 <div id="div1">1
  <a id="a" href="百度2下">我的皎月闻越想闻</a>
 </div>
 </div>
</body>
<script>
 var d2 = document.getElementById('div2');
 var d1 = document.getElementById('div1');
 var a = document.getElementById('a');
 d2.onclick = function(e){
 alert('d2');
 }
 d1.onclick = function(e){
 alert('d1');
 }
 a.onclick = function(e){
 //阻止事件传播
 e.stopPropagation();
 alert('a');
 //阻止浏览器默认行为
 e.preventDefault();
 }
</script>

使用事件对象,实现一个简单的小案例:跟着鼠标飞的div(通过修改事件对象的XY值)

<body>
 <div id="div2">2
 <div id="div1">1
  <a id="a" href="百度2下">我的皎月闻越想闻</a>
 </div>
 </div>
</body>
<script>
 var d2 = document.getElementById('div2');
 var d1 = document.getElementById('div1');
 var a = document.getElementById('a');
 d2.onclick = function(e){
 alert('d2');
 }
 d1.onclick = function(e){
 alert('d1');
 }
 a.onclick = function(e){
 //阻止事件传播
 e.stopPropagation();
 alert('a');
 //阻止浏览器默认行为
 e.preventDefault();
 }
</script>

一起深入理解js中的事件对象

点击前(不动)

一起深入理解js中的事件对象

点击后(跟着鼠标走)

总结

到此这篇关于js中事件对象的文章就介绍到这了,更多相关js事件对象内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript 获取url参数和script标签中获取url参数函数代码
Jan 22 Javascript
js日历功能对象
Jan 12 Javascript
jQuery的each终止或跳过示例代码
Dec 12 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
Apr 08 Javascript
js取模(求余数)隔行变色
May 15 Javascript
javascript委托(Delegate)blur和focus用法实例分析
May 26 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
Oct 09 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
Sep 01 jQuery
jquery如何实现点击空白处隐藏元素
Dec 05 jQuery
原生JS实现DOM加载完成马上执行JS代码的方法
Sep 07 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
Dec 05 jQuery
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
Jun 14 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 #Vue.js
vue3.0 自适应不同分辨率电脑的操作
Feb 06 #Vue.js
vue使用echarts画组织结构图
Feb 06 #Vue.js
javascript中layim之查找好友查找群组
Feb 06 #Javascript
JavaScript中layim之整合右键菜单的示例代码
Feb 06 #Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 #Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 #Vue.js
You might like
社区(php&amp;&amp;mysql)一
2006/10/09 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
python实现redis三种cas事务操作
2017/12/19 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
Python替换月份为英文缩写的实现方法
2019/07/15 Python
VSCode配合pipenv搞定虚拟环境的实现方法
2020/05/17 Python
python如何调用字典的key
2020/05/25 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5 HTMLCollection和NodeList的区别详解
2020/04/29 HTML / CSS
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
石油大学毕业生自荐信
2014/01/28 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书