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事件揭秘》。

本文为劳卜原创文章,首发于微信公众号:前端呼啦圈(Love-FED)
转载请注明来自——微信公众号:前端呼啦圈(Love-FED)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis 分区 属性值_ArcGIS制图之Maplex自动点抽稀

制图工作中&#xff0c;大量密集点显示是最常遇到的问题。其特点是分布可能不均匀、数据点比较密集&#xff0c;容易造成空间上的重叠&#xff0c;影响制图美观。那么&#xff0c;如果美观而详细的显示制图呢&#xff1f;主要原理Maplex中对标注有很好的显示控制&#xff0c;一…

学术造假导致导师自杀,后将这段学术丑闻经历出书贩卖,一年收入上百万......

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年2月11日&#xff0c;小保方晴子又被撤回了一篇研究论文。Tissue Engineering Part A撤稿给出的原因是&#xff1a;通过哈佛医学院正式调查后&#xff0c;无法确实其实验结果的准确性&#xff0c;尽管作者本人坚持已…

汇编语言之数据处理的2个基本问题

&#xfeff;&#xfeff;1、bx、si、di和bp Bx、si和di这3个寄存器我们已经学过了&#xff0c;现在进行一下总结&#xff0c;并学一下bp。 1&#xff1a;在8086CPU中&#xff0c;只有这4个寄存器可以用在[…]中来进行内存单元的寻址。比如&#xff0c;下面的指令都是正确 的…

nvm用标准sata ahci码_能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘...

不知不觉当中&#xff0c;固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘&#xff0c;使用NVMeSATA的固态硬盘高低搭配。既然是高低搭配&#xff0c;就一定会有性能差距&#xff0c;是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速&#xff0…

天了噜!定义static字段还有顺序要求?

前言前段时间&#xff0c;发现一个bug&#xff0c;代码结构类似下面的示例。你能说出这段代码的正确返回结果吗&#xff1f;class Program {private static int a1 a2;private static int a2 Init();private static int Init(){return 123;}static void Main(string[] args){…

汇编语言之转移指令和原理

&#xfeff;&#xfeff;1、引言 可以修改IP&#xff0c;或同时修改CS和IP的指令统称为转移指令。概括地讲&#xff0c;转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类&#xff1a; 1. 同时修改CS和IP时&#xff0c;称为段间转移&#…

【高德地图开发2】---配置工程

1.从网站下载开发包并解压。 3D地图包解压后得到&#xff1a;3D地图显示包“Android_Map_2.x.x.jar ”和文件夹“ armeabi ”&#xff08;以 V2.2.0为例&#xff0c;含 - libamapv302.so 和 libmapv302ex.so 文件&#xff09;。2D地图包解压后得到&#xff1a;2D地图显示包“An…

antd option宽度自适应_建议收藏:Axure手机自适应教程

hello&#xff0c;我又来啦&#xff0c;今天和大家分享用axure怎么做自适应&#xff0c;也就是说&#xff0c;我们做app端的作品时&#xff0c;怎么在不同的手机尺寸&#xff0c;显示最佳的样式。那么这期的话&#xff0c;我会以一个游戏的案例来展开&#xff0c;所以比较好玩。…

安装pip

2019独角兽企业重金招聘Python工程师标准>>> linux系统安装pip&#xff1a; 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pip.py 2.安装pip python get-pip.py windows系统安装pip,这里使用easy_install: 1.首先在命令行切换到easy_install.exe所在的Scri…

所以,路遥工具箱到底是什么东西?

笔者的软件开发生涯是从 2008 年开始的&#xff0c;彼时还是 2G 时代。站长之家是笔者当时经常访问的网站&#xff0c;站长工具也成为当时探索网络世界时的入门工具。软件开发这些年也是浑浑噩噩的度过&#xff0c;鲜有建树。2020 年之前也写了一些小工具用于解决一些注入字符串…

刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

▲ 点击查看前阵子发现一个英国BBC制作的纪录片&#xff0c;叫《逻辑的乐趣》&#xff08;The Joy Of Logic&#xff09;&#xff0c;介绍了逻辑的概念&#xff0c;逻辑的发展史&#xff0c;及其在现实生活中的应用和价值。讲解非常有意思&#xff0c;深入浅出&#xff0c;风趣…

oracle技术之顺序文件上的索引(一)

顺序文件上的索引&#xff08;一&#xff09;研究索引结构&#xff0c;我们首先来考虑最简单的一种&#xff1a;由一个称为数据文件的排序文件得到另一个称为索引文件的文件&#xff0c;而这个索引文件由键-指针对组成。在索引文件中查找键K通过指针指向数据文件中查找键为K的记…

汇编语言之标志寄存器

&#xfeff;&#xfeff;1、标志寄存器 CPU内部的寄存器中&#xff0c;有一种特殊的寄存器&#xff08;对于不同的处理机&#xff0c;个数和结构都可能不同&#xff09;具有以下3种作 用&#xff1a; 1. 用来存储相关指令的某些执行结果。 2. 用来为CPU执行相关指令提供行…

web网页的表单排版利器--960css

表单排版样式 960css 前言 一般web网页的表单排版&#xff0c;大家都习惯用table排版&#xff0c;自己需要根据实际需要去定义TR和TD&#xff0c;很多时候对于TD的高宽度、是否合并行&#xff0c;合并列&#xff0c;都要去做一些处理&#xff0c;这些都是比较繁琐的工作。找到一…

c语言将十进制转化为二进制算法_base64算法初探即逆向分析

算法分析虽说base64严格意义上来说并不能算是加密算法&#xff0c;但的确应用方面来说还算是比较广&#xff0c;在CTF的算法逆向中Base系列算是也比较常见的&#xff0c;萌新刚开始学算法&#xff0c;就以base64为例&#xff0c;对该算法进行一个简单的分析。简单来说&#xff…

新功能抢先看!Windows 11 2022 版全新 ISO 镜像来了+下载

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 操作系统全新 ISO 镜像文件&#xff0c;此版本 ISO 镜像整合了自 Build 22449 至 Build 22533 的所有功能。文件名称:windows11_insiderpreview_client_x64_zh-cn_22533.iso 文件大小: 4.64 GB MD5:…

这是哪里来的小妖精!!!

1 或许小鸟依人就是怎么来的吧2 果然球体运动全靠弹。。3 小猫咪从爬猫架下来时的样子萌爆了....4 这猫也是很配合了~5 以后请不要说“有朝一日”&#xff0c;请说“下周五晚七点我请你吃火锅”&#xff0c;“三分钟后我给你打钱”&#xff0c;“现在我就喜欢你”。6 内容来源于…

汇编语言之常见的汇编指令

1、常见汇编指令 1. 传送指令&#xff08;4个&#xff09;&#xff1a;mov、push、pop、lea。2. 转移指令&#xff08;8个&#xff09;&#xff1a;call、jmp、je、jne、jb、jnb、ja、jna。3. 运算指令&#xff08;7个&#xff09;&#xff1a;add、sub、mul、div、adc、sbb、c…