DOM 事件的深入浅出(二)


Posted in Javascript onDecember 05, 2016

DOM 事件的深入浅出(二)

在DOM事件的深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法。本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性和方法。

那么什么是DOM事件中Event对象呢?事件对象(event object)指的是与特定事件相关且包含该事件详细信息的对象。我们可以通过传递给事件处理程序的参数获取事件触发后所产生的一系列方法和属性。

Event对象

Event对象其实是一个事件处理程序的参数,当调用事件时,我们只需要将其传入事件函数就可以获取。代码如下:

function getEvent(event) {
 event = event || window.event;
}

上面的事件函数传入了一个名叫Event的参数作为事件对象,同时做了浏览器兼容处理。在IE8及以前本版之中,通过设置属性注册事件处理程序时,调用的时候并未传递事件对象,需要通过全局对象window.event来获取。所以上述代码中我们利用 || 来做判断,如果event对象存在则使用event,不存在则使用window.event。

Event对象包含了几个方法和多个属性,通过这些方法和属性我们可以获取事件的详细信息并进行相关处理。

Event对象方法

Event对象主要有以下两个方法,用于处理事件的传播(冒泡、捕获)和事件的取消。

1.stopPropagation

stopPropagation方法主要用于阻止事件的进一步传播,比如阻止事件继续向上层冒泡。

function getEvent(event) {
 event.stopPropagation();
}
child.addEventListener('click', getEvent, false);

如果你需要兼容IE8及以下版本浏览器,则需要利用cancelBubble来代替stopPropagation,因为低版本IE不支持stopPropagation方法。

function getEvent(event) {
 event = event || window.event;
 if (event.stopPropagation) {
 event.stopPropagation();
 } else {
 event.cancelBubble = true;
 }
}

cancelBubble是IE事件对象的一个属性,设置这个属性为true能阻止事件进一步传播。

2.preventDefault

preventDefault方法用于取消事件的默认操作,比如a链接的跳转行为和表单自动提交行为就可以用preventDefault方法来取消。代码如下:

<a id="go" href="https://www.baidu.com/">禁止跳转</a>
var go = document.getElementById('go');
function goFn(event) {
 event.preventDefault();
 console.log('我没有跳转!');
}
go.addEventListener('click', goFn, false);

通过preventDefault,我们成功阻止了a链接的跳转行为。不过,在IE9之前的浏览器中需要设置returnValue属性为false来实现。如下:

function goFn(event) {
 event = event || window.event;
 if (event.preventDefault) {
 event.preventDefault();
 } else {
 event.returnValue = false;
 }
 console.log('我没有跳转!');
}

除了以上Event对象的两个主要方法,当前DOM事件规范草案在Event对象上还定义了另一个方法,命名为stopImmediatePropagation。

3.stopImmediatePropagation

和stopPropagation相比,stopImmediatePropagation同样可以阻止事件的传播,不同点在于其还可以把这个元素绑定的同类型事件也阻止了。如:

var go = document.getElementById('go');

function goFn(event) {
 event.preventDefault();
 event.stopImmediatePropagation(); // 阻止事件冒泡并阻止同类型事件
 console.log('我没有跳转!');
}
function goFn2(event) {
 console.log('我是同类型事件!');
}
go.addEventListener('click', goFn, false);
go.addEventListener('click', goFn2, false);

我们在a链接上继续加了一个点击事件,如果我们在goFn方法中添加了stopImmediatePropagation方法,那么goFn2方法将不会被执行,同时也不会将点击事件冒泡至上层。

需要注意的是,stopImmediatePropagation目前一部分浏览器尚不支持,但是像jQuery这样的库封装了跨平台的stopImmediatePropagation方法。

Event对象属性

与Event对象的方法相比,因Event对象的属性相对较多,文本无法一一讲解,所以主要介绍实际项目中常用的Event对象属性。

1.type属性

通过type我们可以获取事件发生的类型,比如点击事件我们获取的是'click'字符串。

var go = document.getElementById('go');
function goFn(event) {
 console.log(event.type); // 输出'click'
}
go.addEventListener('click', goFn, false);

2.target属性

target属性主要用于获取事件的目标对象,比如我们点击a标签获取的是a标签的html对象。

var go = document.getElementById('go');
function goFn(event) {
 var target = event.target;
 console.log(target === go) // 返回true
}
go.addEventListener('click', goFn, false);

在IE8及之前版本,我们需要使用srcElement而非target。兼容方案如下:

function goFn(event) {
 var event = event || window.event, 
 target = event.target || event.srcElement;
 console.log(target === go) // 返回true
}

3. 鼠标事件属性

在用鼠标触发事件时,主要的事件属性包含鼠标的位置和按键的状态,比如:clientX和clientY指定了鼠标在窗口坐标中的位置,button和which指定了按下的鼠标键是哪个。

function moveFn(event) {
 console.log(event.screenX) // 获取鼠标基于屏幕的X轴坐标
 console.log(event.screenY) // 获取鼠标基于屏幕的Y轴坐标
 console.log(event.clientX) // 获取鼠标基于浏览器窗口的X轴坐标
 console.log(event.clientY) // 获取鼠标基于浏览器窗口的Y轴坐标
 console.log(event.pageX) // 获取鼠标基于文档的X轴坐标
 console.log(event.pageY) // 获取鼠标基于文档的Y轴坐标
}
function clickFn(event) {
 console.log(event.button) // 获取鼠标按下的键。非IE浏览器中0为鼠标左键,1为鼠标中键,2为鼠标右键
 console.log(event.which) // 获取指定事件上哪个键盘键或鼠标按钮被按下
}
document.addEventListener('mouseover', moveFn, false);
document.addEventListener('click', clickFn, false);

4.键盘事件属性

在用键盘触发事件时,主要的事件属性包含键盘的按键keyCode和是否按下特殊键,比如:keyCode指定了按下键的键码值,ctrlKey指定是否按下了ctrl键。

function keyFn(event) {
 console.log(event.keyCode); // 获取按下键的键码值
 console.log(event.ctrlKey); // 获取是否按下了ctrl键
 console.log(event.shiftKey); // 获取是否按下了shift键
 console.log(event.altKey); // 获取是否按下了alt键
 console.log(event.metaKey); // 获取是否按下了meta键
}
document.addEventListener('keyup', keyFn, false);

类似的事件属性还有表单事件属性和window事件属性等,这里不再做详细介绍。有兴趣的同学可以查阅相关资料。

总结

本文主要讲解了DOM事件中Event对象的常用属性和方法,同时也介绍了其在IE中的兼容性问题及解决方案。然而关于DOM事件的知识点远不止这些,希望仅此能够帮助初识DOM的开发者。

备注:文本参考自《Javascript权威指南》一书及慕课网教程《DOM事件揭秘》。

以上就是本文的全部内容,希望对大家有所帮助,有兴趣的朋友可以看下《DOM事件的深入浅出(一)》,谢谢对三水点靠木的支持!

Javascript 相关文章推荐
JavaScript语言中的Literal Syntax特性分析
Mar 08 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
Mar 09 Javascript
extjs中grid中嵌入动态combobox的应用
Jan 01 Javascript
jquery无法设置checkbox选中即没有变成选中状态
Mar 27 Javascript
js实现登陆遮罩效果的方法
Jul 28 Javascript
javascript实现的猜数小游戏完整实例代码
May 10 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
Angular表单验证实例详解
Oct 20 Javascript
微信小程序开发教程-手势解锁实例
Jan 06 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
微信小程序功能之全屏滚动效果的实现代码
Nov 22 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 Javascript
vue.js指令v-model实现方法
Dec 05 #Javascript
DOM 事件的深入浅出(一)
Dec 05 #Javascript
使用微信小程序开发前端【快速入门】
Dec 05 #Javascript
学习vue.js表单控件绑定操作
Dec 05 #Javascript
JavaScript易错知识点整理
Dec 05 #Javascript
JS 对java返回的json格式的数据处理方法
Dec 05 #Javascript
原生js实现键盘控制div移动且解决停顿问题
Dec 05 #Javascript
You might like
一些花式咖啡的配方
2021/03/03 冲泡冲煮
php接口实现拖拽排序功能
2018/04/23 PHP
js 数值项目的格式化函数代码
2010/05/14 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
nodejs入门教程五:连接数据库的方法分析
2017/04/24 NodeJs
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
原生JS实现的轮播图功能详解
2018/08/06 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
讲解Python中fileno()方法的使用
2015/05/24 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
python为什么会环境变量设置不成功
2020/06/23 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python爬取youtube视频的示例代码
2021/03/03 Python
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
Python如何定义一个函数
2015/09/01 面试题
大学生毕业的自我评价分享
2014/01/02 职场文书
安全标准化汇报材料
2014/02/03 职场文书
创先争优活动个人总结
2015/03/04 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
太空授课观后感
2015/06/17 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android