事件发生以后,会产生一个事件对象(Event),代表事件的状态。下面本篇文章就来带大家深入了解一下JS中的事件对象Event,对它做一个详细的解读,希望对大家有所帮助!
一、什么是事件对象 Event
每一个事件触发时,都会产生一个与之对应的事件对象 event
,其中包含了触发事件的元素、键盘鼠标的状态、位置等等内容。
每当用户触发一个事件后,JS 就会自动生成一个 event
对象,根据触发事件的不同,这个对象包含的内容也不同,比如通过鼠标触发点击事件,会产生一个 MouseEvent
对象,其中包含了鼠标的位置等内容;通过键盘触发事件,会产生一个 KeyboardEvent
对象其中包含按键相关的信息。
-
event
对象代表事件的状态,比如触发事件的元素、键盘按键的状态、鼠标的位置、鼠标按键的状态等等; -
event
对象是一个隐式参数,并且只在事件发生的过程中才有效; -
event
对象根据触发方式的不同会具有不同的属性,也就是说某些属性只对特定事件有效,但所有内容都是继承自Event
对象; event
对象在IE
与Chrome
等浏览器表现不尽相同,例如说event.target
表示触发事件的元素,在IE
中需要使用event.srcElement
获取;
Event
对象本身就是一个构造函数,可以用来生成新的实例。
event = new Event(type, options);
Event
构造函数接受两个参数。第一个参数type
是字符串,表示事件的名称;第二个参数options
是一个对象,表示事件对象的配置。该对象主要有下面两个属性。
bubbles
:布尔值,可选,默认为false,表示事件对象是否冒泡。cancelable
:布尔值,可选,默认为false,表示事件是否可以被取消,即能否用Event.preventDefault()
取消这个事件。一旦事件被取消,就好像从来没有发生过,不会触发浏览器对该事件的默认行为。
var ev = new Event( 'look', { 'bubbles': true, 'cancelable': false } ); document.dispatchEvent(ev);
上面代码新建一个look
事件实例,然后使用dispatchEvent
方法触发该事件。
注意,如果不是显式指定bubbles
属性为true
,生成的事件就只能在“捕获阶段”触发监听函数。
// HTML 代码为 // <div><p>Hello</p></div> var div = document.querySelector('div'); var p = document.querySelector('p'); function callback(event) { var tag = event.currentTarget.tagName; console.log('Tag: ' + tag); // 没有任何输出 } div.addEventListener('click', callback, false); var click = new Event('click'); p.dispatchEvent(click);
上面代码中,p
元素发出一个click
事件,该事件默认不会冒泡。div.addEventListener
方法指定在冒泡阶段监听,因此监听函数不会触发。如果写成div.addEventListener('click', callback, true)
,那么在“捕获阶段”可以监听到这个事件。
另一方面,如果这个事件在div元素上触发。
div.dispatchEvent(click);
那么,不管div
元素是在冒泡阶段监听,还是在捕获阶段监听,都会触发监听函数。因为这时div
元素是事件的目标,不存在是否冒泡的问题,div
元素总是会接收到事件,因此导致监听函数生效。
二、Event 属性
我们在前面提到,根据触发方式的不同 event
对象会具有不同的属性,我们可以将其大体分为四部分:
通用属性 (无论是通过键盘还是鼠标触发都拥有的属性)
bubbles
事件是否会冒泡,布尔值;cancelable
事件是否具有默认行为,布尔值;
默认行为指的是浏览器中规定的一些行为,比如<a></a>
标签点击后会跳转链接,<form></form>
标签内按回车会自动提交等等。currentTarget
事件处理程序当前正在处理事件的那个元素,返回一个Element
对象;defaultPrevented
事件是否取消了默认行为,布尔值;detail
返回一个包含事件详细信息的数字
在click
、mousedown
和mouseup
事件中,该数字表示当前的点击次数,dblclick
事件中,该数字一直为 2 。在键盘事件和鼠标经过事件中,该数字一直为0。eventPhase
返回一个代表事件处理程序发生时所在阶段的数字;
0表示当前阶段未发生其他事件;1表示当前事件在捕获阶段发生;2表示当前事件处于目标阶段;3表示当前事件处于冒泡阶段;isTrusted
表示该事件是由用户行为触发的,还是由 JS 代码触发的,布尔值;
当事件是由用户行为(点击等)触发时,值为true
,当事件是通过EventTarget.dispatchEvent()
派发的时候,这个属性的值为false
。
- 列表1
- 列表2
- 列表3
- 列表4
点击列表1后,控制台打印如下结果:
target
返回触发该事件的目标节点,返回一个Element
对象;
target
并不一定与this
指向相同,this
指向的是当前发生事件的元素,而target
指向的是触发该事件的元素,可以将上方代码中的console.log(event.eventPhase);
换成console.log(event.target);
来具体体验一下两者的不同。
在IE
浏览器中应使用srcElement
来代替target
。type
返回触发的事件名称,例click
,keydown
等;
鼠标属性
-
button
当事件被触发时,哪个鼠标按钮被点击; -
clientX
当事件被触发时,鼠标指针的 x 轴坐标; -
clientY
当事件被触发时,鼠标指针的 y 轴坐标; -
screenX
当事件被触发时,鼠标指针的 x 轴坐标; -
screenY
当事件被触发时,鼠标指针的 y 轴坐标;
键盘属性
-
altKey
当事件被触发时,“Alt” 是否被按下; -
ctrlKey
当事件被触发时,“Ctrl” 是否被按下; -
metaKey
当事件被触发时,“meta” 是否被按下; -
shiftKey
当事件被触发时,“Shift” 是否被按下; -
Location
返回按键在设备上的位置; -
charCode
当事件被触发时,触发键值的字母代码; -
key
按下按键时返回按键的标识符; -
keyCode
返回keypress
事件触发的键的值的字符代码,或者keydown
或keyup
事件的键的代码; -
which
返回keypress
事件触发的键的值的字符代码,或者keydown
或keyup
事件的键的代码; -
relatedTarget
返回与事件的目标节点相关的节点。
IE属性
-
cancelBubble
如果想阻止事件冒泡,必须把该属性设为true
; -
fromElement
对于mouseover
和mouseout
事件,fromElement
引用移出鼠标的元素; -
returnValue
等同于defaultPrevented
; -
srcElement
等同于target
; -
toElement
对于mouseover
和mouseout
事件,该属性引用移入鼠标的元素; -
x
事件发生的位置的 x 坐标; -
y
事件发生的位置的 y 坐标;
三、Event 方法
-
initEvent()
初始化新创建的Event
对象的属性; -
preventDefault()
阻止触发事件元素的默认行为; -
stopPropagation()
阻止事件冒泡;
如果想要阻止事件元素的默认行为,例如点击 <a></a>
标签时执行点击事件,不要跳转链接,需要在事件处理程序中调用 preventDefault
方法:
<a>百度一下,你就知道</a> <script> document.querySelector("a").onclick = function () { event.preventDefault(); // do something } </script>
如果想要阻止事件冒泡,例如点击子元素标签时执行子元素的点击事件,而不想要执行父级元素的事件处理程序,则需要调用 stopPropagation
方法:
- 不要触发 ul 的点击事件处理程序
其他相关方法
-
addEventListener()
给目标元素注册监听事件; -
createEvent()
创建一个Event
对象; -
dispatchEvent()
将事件发送到目标元素的监听器上; -
handleEvent()
把任意对象注册为事件处理程序; -
initMouseEvent()
初始化鼠标事件对象的值; -
initKeyboardEvent()
初始化键盘事件对象的值; -
initMutationEvent()
初始变动事件和HTML
事件对象的值; -
initCustomEvent()
初始自定义事件对象的值; -
removeEventListener()
删除目标元素上的某个监听事件;
另外关于 createEvent
方法,根据传入参数的不同,会返回不同的 event
对象:
-
MouseEvents
创建鼠标事件对象,返回的对象中包含initMouseEvent()
方法; -
KeyboardEvent
创建键盘事件对象,返回的对象中包含initKeyEvent()
方法; -
KeyEvents
在firefox
中创建键盘事件对象需要传入该参数; -
MutationEvents
模拟变动事件和 HTML 事件的事件对象,返回的对象中包含initMutationEvent
方法; -
CustomEvent
创建自定义事件对象,返回的对象中包含initCustomEvent()
方法;
四、模拟事件
4.1 模拟鼠标事件
我们可以通过 createEvent()
方法可以创建一个新的 event
对象,借助 initMouseEvent()
方法来对这个鼠标事件对象的值进行初始化,该方法接受十五个参数,分别与鼠标事件中的各个属性一一对应,按照 type
、bubbles
、cancelable
、view
、detail
、screenX
、screenY
、clientX
、clientY
、ctrlKey
、altKey
、shiftKey
、、metaKey
、button
、relatedTarget
的顺序传入即可:
var oBtn = document.querySelector("button"); // 为 button 绑定事件处理程序 oBtn.addEventListener("click", function () { console.log(event); }) var event = document.createEvent("MouseEvents"); // 通过 initMouseEvent() 方法初始化鼠标事件的 event 对象 event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); // 通过 dispatchEvent() 方法来触发 oBtn 上绑定的点击事件,此时浏览器打印的 event 对象为自定义的 event oBtn.dispatchEvent(event);
初始化事件对象时,最重要的是前四个参数,因为浏览器在触发事件时,这四个参数是必须的,而剩余的参数只有在事件处理程序中才会被使用,target
会在执行 dispatchEvent
方法时自动赋值;
4.2 模拟键盘事件
同样需要先使用 createEvent()
方法可以创建一个新的 event
对象,但需要使用 initKeyEvent
来对键盘事件对象的值进行初始化,该方法接收八个参数,分别于键盘事件对象中的各个属性一一对应,按照 type
、bubbles
、cancelable
、view
、key
、location
、modifiers
、repeat
的顺序传入即可。但在 firefox
中,需要按照 type
、bubbles
、cancelable
、view
、ctrlKey
、altKey
、shiftKey
metaKey
keyCode
charCode
` 的顺序传入十个参数
document.onkeydown = function () { console.log(event); } var event = document.createEvent("KeyboardEvent"); event.initKeyboardEvent("keydown", false, false, document.defaultView, "a", 0, "Shift", 0); document.dispatchEvent(event);
4.3 模拟其他事件
如果想要模拟其他事件,诸如 submit
、focus
等 HTML
和变动事件,则需要通过 MutationEvents
方法来创建事件,通过 initEvent
方法来进行初始化,按照type
、bubbles
、cancelable
、relatedNode
、preValue
、newValue
、attrName
、attrChange
的顺序传入参数。
<input> <script> var oInput = document.querySelector("input"); oInput.addEventListener("focus", function () { this.style.background = "#ccc" }) var event = document.createEvent("HTMLEvents"); event.initEvent("focus", true, false); oInput.dispatchEvent(event); </script>
4.4 自定义 DOM 事件
自定义事件不是由 DOM 原生触发的,它的目的是让开发人员创建自己的事件。要创建新的自定义事件,可以调用 createEvent("CustomEvent")
,返回的对象有一个名为 initCustomEvent()
的方法,接收 type
、bubbles
、cancelable
、detail
四个参数。
var oInput = document.querySelector("input"); oInput.addEventListener("myEvent", function () { console.log(event); }) var event = document.createEvent("CustomEvent"); event.initCustomEvent("myEvent", true, false, "自定义事件myEvent"); oInput.dispatchEvent(event);
上方代码创建了一个自定义事件,事件名为 myEvent
, 该事件可以向上冒泡,不可以执行在浏览器中的默认行为, detail
属性的值为 自定义事件myEvent
,可以在绑定该事件的元素或者元素的父级元素上绑定事件处理程序来查看 event
对象。
五、Event的兼容性处理
主要考虑到 IE
浏览器与 Chrome
等浏览器事件对象的区别,针对下面四个属性,需要进行特殊处理:
获得
event
对象var event = event || window.event;
获得
target
对象var target = event.target || event.srcElement;
阻止浏览器默认行为
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
阻止事件冒泡
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
【相关推荐:javascript学习教程】
以上是深入解析JS中的事件对象Event的详细内容。更多信息请关注PHP中文网其他相关文章!

是的,JavaScript的引擎核心是用C语言编写的。1)C语言提供了高效性能和底层控制,适合JavaScript引擎的开发。2)以V8引擎为例,其核心用C 编写,结合了C的效率和面向对象特性。3)JavaScript引擎的工作原理包括解析、编译和执行,C语言在这些过程中发挥关键作用。

JavaScript是现代网站的核心,因为它增强了网页的交互性和动态性。1)它允许在不刷新页面的情况下改变内容,2)通过DOMAPI操作网页,3)支持复杂的交互效果如动画和拖放,4)优化性能和最佳实践提高用户体验。

C 和JavaScript通过WebAssembly实现互操作性。1)C 代码编译成WebAssembly模块,引入到JavaScript环境中,增强计算能力。2)在游戏开发中,C 处理物理引擎和图形渲染,JavaScript负责游戏逻辑和用户界面。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版
中文版,非常好用

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Atom编辑器mac版下载
最流行的的开源编辑器