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 相关文章推荐
解决 FireFox 下[使用event很麻烦] 的问题.
Aug 22 Javascript
用JavaScript脚本实现Web页面信息交互
Oct 11 Javascript
jquery在Chrome下获取图片的长宽问题解决
Mar 20 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
js图片翻书效果代码分享
Aug 20 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
KnockoutJs快速入门教程
May 16 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 Javascript
JavaScript的Set数据结构详解
Feb 18 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
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
django的settings中设置中文支持的实现
2019/04/28 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
Python调用Windows命令打印文件
2020/02/07 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
django中cookiecutter的使用教程
2020/12/03 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
租房协议书
2014/04/10 职场文书
电工技术比武方案
2014/05/11 职场文书
产品售后服务承诺书
2014/05/21 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
公司环境卫生管理制度
2015/08/05 职场文书
初一年级组工作总结
2015/08/12 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript