Files
rikako-note/javascript/js事件.md
2022-06-23 00:13:20 +08:00

44 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# js事件
- ## js event
- 对于可以触发事件的对象其会有一个addEventListener方法通过该方法可以为对象的特定事件注册handler。addEvnetListener接受两个参数
- event name
- event handler
- 对于js语言在不同的环境下event model可能会有所不同例如在web浏览器环境下和nodejs环境下event model就不完全相同
- 可以通过removeEventHandler来移除handler该方法同样接收两个参数event name和handler
- ## 在js中为事件添加复数个handler
- 通过多次调用addEventHandler可以为同一个事件添加多个handler在事件发生后多个handler都会被调用
- ## Event Handler Properties
- 在js中如果一个对象能够触发某个事件通常该对象会有一个onxxx属性例如onclick、onmouseover等。可以通过为该属性赋值一个函数来为该事件添加handler
```javascript
let p=document.querySelector("#bt")
p.onclick=()=>{
alert("button is clicked")
}
```
- 但是通过为对象的onclick属性赋值无法为该对象的同一个事件添加多个handler对onclick属性的多次赋值之后的赋值操作会覆盖前面的赋值操作
- ## inline event handler不推荐
- 可以在html文件中为标签的onxxx属性指定调用的js方法来为事件添加handler但是这种方法永远不应该被使用
- 使用inline event handler时如果多个元素都为相同事件添加相同的handler那么相同的函数调用代码将会在html文件中重复多次修改会花费大量时间
- 并且使用inline event handler会令js代码和html代码糅合在一起最好将js代码和html代码分开
- ## event对象
- handler的参数中可以含有一个event对象用来记录触发事件的信息例如event.target记录了指向触发事件的对象的引用
- 可以通过event.preventDefault()方法来取消浏览器为该事件定义的默认处理。
- 可以通过event.stopProgation()方法阻止该事件的传播
- 通过return false默认会同时调用event.preventDefault和event.stopProgation
- ## 事件传播的三个阶段
- capturing阶段
- 捕获阶段首先会检查触发事件元素的最外层元素html检查其是否注册了capture阶段的handler如果注册了就运行handler
- 然后其会移动到html内部元素并做相同的事情如果元素有注册capture阶段handler就执行并依次向内移动直到遇到触发事件元素的直接父元素
- target阶段
- 首先target阶段会检查EventTarget是否有为event注册的handler如果有就运行它
- 如果event的bubbles为true其会将event事件传播给EventTarget元素的父元素并以此向上传播直到到达html元素如果bubbles为false则event不会被向上传播给EventTarget的任何父元素
- bubbling阶段
- 检查是否EventTarget的直接父元素为bubbling阶段注册了handler如果有就运行
- 对EventTarget父元素的父元素做同样的事检查是否为bubbling阶段注册有handler如果有就执行依次向上传播直到到达html元素
- >对于所有的js事件都会经历capturing阶段和target阶段但是只有bubbles属性为true的事件才会经历bubbling阶段
- > 对于target阶段对于EventTarget无论是为capturing阶段注册的handler还是为bubbling阶段注册的handler都会被执行
- > addEventListener默认情况下注册的阶段是bubbling可以为其制定useCapture为true(默认为false)来指定注册的listener为capturing阶段
- > 可以在event handler中调用event.stopPropagation来阻止事件在bubbling过程中向上传播
- ## event.target和event.currentTarget
- event.target触发事件的元素
- event.currentTarget当前handler所附加到的元素在bubbling阶段时间传播到的上层祖先节点