After the event occurs, an event object (Event) will be generated, representing the status of the event. The following article will give you an in-depth understanding of the event object Event in JS and a detailed interpretation of it. I hope it will be helpful to everyone!
When every event is triggered, a corresponding event object will be generatedevent
, which includes the element that triggered the event, the status of the keyboard and mouse, the position, etc.
Whenever the user triggers an event, JS will automatically generate anevent
object. Depending on the triggering event, this object contains different contents. For example, a click event is triggered by the mouse. AMouseEvent
object will be generated, which contains the mouse position and other contents; triggering an event through the keyboard will generate aKeyboardEvent
object which contains key-related information.
event
The object represents the status of the event, such as the element that triggered the event, the status of the keyboard button, the position of the mouse, the status of the mouse button, etc.;event
The object is an implicit parameter and is only valid during the event;event
The object will have different properties depending on the triggering method. That is to say, some properties are only valid for specific events, but all contents are inherited from theEvent
object; theevent
object is inIE
The behavior of browsers such asChrome
is different. For example,event.target
represents the element that triggers the event. InIE
, you need to useevent.srcElement
Get;
Event
The object itself is a constructor that can be used to generate new instances.
event = new Event(type, options);
Event
The constructor accepts two parameters. The first parametertype
is a string, indicating the name of the event; the second parameteroptions
is an object, indicating the configuration of the event object. This object mainly has the following two properties.
bubbles
: Boolean value, optional, defaults to false, indicating whether the event object bubbles.
cancelable
: Boolean value, optional, defaults to false, indicating whether the event can be canceled, that is, whether it can be canceled usingEvent.preventDefault()
Cancel this event. Once an event is canceled, it is as if it never occurred and the browser's default behavior for that event will not be triggered.
var ev = new Event( 'look', { 'bubbles': true, 'cancelable': false } ); document.dispatchEvent(ev);
The above code creates a newlook
event instance, and then uses thedispatchEvent
method to trigger the event.
Note that if thebubbles
attribute is not explicitly specified astrue
, the generated event can only trigger the listening function in the "capture phase".
// HTML 代码为 //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);Hello
In the above code, thep
element emits aclick
event, which does not bubble by default.div.addEventListener
The method specifies listening during the bubbling phase, so the listening function will not be triggered. If it is written asdiv.addEventListener('click', callback, true)
, then this event can be monitored during the "capture phase".
On the other hand, if this event fires on a div element.
div.dispatchEvent(click);
Then, no matter whether thediv
element is listening in the bubbling stage or in the capturing stage, the listening function will be triggered. Because thediv
element is the target of the event at this time, there is no question of whether it bubbles up. Thediv
element will always receive the event, thus causing the listening function to take effect.
We mentioned earlier that objects will have different attributes depending on the triggering method. We can It is roughly divided into four parts:
General properties(properties owned whether triggered by keyboard or mouse)
Whether the event will bubble, Boolean;
Whether the event has default behavior, Boolean Value;Default behavior refers to some behaviors specified in the browser, such as
The link will jump after clicking on the label,Click within the label Enter will automatically submit and so on.
The element where the event handler is currently processing the event returns anElement
object;
Whether the event cancels the default behavior, Boolean value;
Returns a number containing event detailsIn the
click
,mousedown
andmouseup
events, this number represents the current number of clicks. In thedblclick
event, this number is always 2 . In keyboard events and mouse over events, this number is always 0.
eventPhase
返回一个代表事件处理程序发生时所在阶段的数字;
0表示当前阶段未发生其他事件;1表示当前事件在捕获阶段发生;2表示当前事件处于目标阶段;3表示当前事件处于冒泡阶段;
isTrusted
表示该事件是由用户行为触发的,还是由 JS 代码触发的,布尔值;
当事件是由用户行为(点击等)触发时,值为true
,当事件是通过EventTarget.dispatchEvent()
派发的时候,这个属性的值为false
。
点击列表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 坐标;initEvent()
初始化新创建的Event
对象的属性;preventDefault()
阻止触发事件元素的默认行为;stopPropagation()
阻止事件冒泡; 如果想要阻止事件元素的默认行为,例如点击标签时执行点击事件,不要跳转链接,需要在事件处理程序中调用
preventDefault
方法:
百度一下,你就知道
如果想要阻止事件冒泡,例如点击子元素标签时执行子元素的点击事件,而不想要执行父级元素的事件处理程序,则需要调用stopPropagation
方法:
其他相关方法
addEventListener()
给目标元素注册监听事件;createEvent()
创建一个Event
对象;dispatchEvent()
将事件发送到目标元素的监听器上;handleEvent()
把任意对象注册为事件处理程序;initMouseEvent()
初始化鼠标事件对象的值;initKeyboardEvent()
初始化键盘事件对象的值;initMutationEvent()
初始变动事件和HTML
事件对象的值;initCustomEvent()
初始自定义事件对象的值;removeEventListener()
删除目标元素上的某个监听事件;另外关于createEvent
方法,根据传入参数的不同,会返回不同的event
对象:
MouseEvents
创建鼠标事件对象,返回的对象中包含initMouseEvent()
方法;KeyboardEvent
创建键盘事件对象,返回的对象中包含initKeyEvent()
方法;KeyEvents
在firefox
中创建键盘事件对象需要传入该参数;MutationEvents
模拟变动事件和 HTML 事件的事件对象,返回的对象中包含initMutationEvent
方法;CustomEvent
创建自定义事件对象,返回的对象中包含initCustomEvent()
方法; 我们可以通过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
方法时自动赋值;
同样需要先使用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);
如果想要模拟其他事件,诸如submit
、focus
等HTML
和变动事件,则需要通过MutationEvents
方法来创建事件,通过initEvent
方法来进行初始化,按照type
、bubbles
、cancelable
、relatedNode
、preValue
、newValue
、attrName
、attrChange
的顺序传入参数。
自定义事件不是由 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
对象。
mainly takes into account the difference in event objects betweenIE
browsers andChrome
and other browser event objects. Special processing is required for the following four properties:
Get theevent
objectvar event = event || window.event;
Gettarget
objectvar target = event.target || event.srcElement;
Prevent browser default behaviorevent.preventDefault? event.preventDefault(): (event.returnValue = false);
Prevent Event bubblingevent.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);
[Related recommendations:javascript Study tutorial】
The above is the detailed content of In-depth analysis of the event object Event in JS. For more information, please follow other related articles on the PHP Chinese website!