事件 | 触发时机 |
---|---|
click | 鼠标的主键在一个元素上被按下和放开时 |
dblclick | 在单个元素上单击两次鼠标的主按钮时 |
contextmenu | 在用户尝试打开上下文菜单时 |
mousedown | 鼠标按钮在元素内按下时 |
mouseup | 鼠标按钮在元素内释放时 |
mouseenter | 鼠标首次移动到元素的激活区域内时 |
mouseleave | 鼠标指针移出某个元素时被触发 |
mousemove | 鼠标的光标在元素内移动时 |
事件 | 触发时机 |
---|---|
keypress | 当按下产生字符或符号值的键时已弃用 |
keydown | 键盘按键按下时(所有按键均会触发) |
keyup | 按键被松开时触发 |
事件 | 触发时机 |
---|---|
focus | 元素获取焦点时 |
blur | 元素失去焦点的时 |
语法
addEventListener(type, listener);
addEventListener(type, listener, options);
addEventListener(type, listener, useCapture);
参数
参数名 | 类型 | 必须 | 说明 |
---|---|---|---|
type | String | 是 | 监听事件类型(大小写敏感) |
listener | Funcion | 是 | 当所监听的事件类型触发时,会接收到一个事件通知Event对象 |
options | Objcet | 可选 | 一个指定有关 listener 属性的可选参数对象 |
useCapture | Boolean | 可选 | false事件冒泡;true事件捕获 |
options可选值
参数名 | 类型 | 必须 | 说明 |
---|---|---|---|
capture | Boolean | 可选 | 事件捕获 |
once | Boolean | 可选 | 最多只调用一次 listener |
passive | Boolean | 可选 | 表示 listener 永远不会调用 preventDefault() |
signal | AbortSignal | 可选 | 该 AbortSignal 的 abort() 方法被调用时,监听器会被移除。 |
示例:绑定input获得焦点事件
<input
type="text"
id="input-name"
/>
<script>
let inputName = document.querySelector('#input-name')
inputName.addEventListener('focus', (event) => {
console.log(event)
})
</script>
addEventListener 方式可以在单个事件上添加多个监听器
<button>按钮</button>
<script>
const btn = document.querySelector('button')
// 添加多个事件处理器
btn.addEventListener('click', () => {
console.log('处理器1')
})
btn.addEventListener('click', () => {
console.log('处理器2')
})
</script>
示例:为div元素绑定click点击事件
<style>
#box {
width: 200px;
height: 200px;
background-color: gray;
}
</style>
<div id="box"></div>
<script>
let box = document.querySelector('#box')
box.onclick = (event) => {
console.log(event)
}
</script>
事件处理器属性,不能为一个事件添加一个以上的处理程序,因为任何后续尝试都会覆写较早设置的属性
<input
type="text"
onfocus="handleFocus()"
/>
<script>
function handleFocus(event) {
let e = event || window.event
console.log(e)
}
</script>
你永远不应该使用 HTML 事件处理器属性——那些已经过时了,使用它们是不好的做法。
<button>按钮</button>
<script>
function handleButtonClick(event) {
console.log(event)
}
const btn = document.querySelector('button')
// 添加事件处理器
btn.addEventListener('click', handleButtonClick)
// 移除监听器
btn.removeEventListener('click', handleButtonClick)
</script>
<button>按钮</button>
<script>
function handleButtonClick(event) {
console.log(event)
}
const controller = new AbortController()
const btn = document.querySelector('button')
// 添加事件处理器
btn.addEventListener('click', handleButtonClick, {
signal: controller.signal, // 向该处理器传递 AbortSignal
})
// 移除任何/所有与该控制器相关的事件处理器
controller.abort()
</script>
表单中只有一个输入框,默认键盘敲下回车就会提交表单,可以阻止这种默认行为
<!-- 表单 -->
<form id="form">
<input
type="text"
id="name"
/>
</form>
<script>
const form = document.querySelector('#form')
form.addEventListener('submit', (e) => {
e.preventDefault()
console.log('submit');
})
</script>
当点击button时,外层容器也会接收到click事件
<div id="box">
<button>点击</button>
</div>
<script>
const btn = document.querySelector('button')
const box = document.querySelector('#box')
btn.addEventListener('click', (e) => {
console.log('btn click')
})
box.addEventListener('click', (e) => {
console.log('box click')
})
</script>
输出顺序
btn click
box click
使用stopPropagation可以阻止事件继续传播
<div id="box">
<button>点击</button>
</div>
<script>
const btn = document.querySelector('button')
const box = document.querySelector('#box')
btn.addEventListener('click', (e) => {
e.stopPropagation() // 阻止冒泡
console.log('btn click')
})
box.addEventListener('click', (e) => {
console.log('box click')
})
</script>
<div id="box">
<button>点击</button>
</div>
<script>
const btn = document.querySelector('button')
const box = document.querySelector('#box')
btn.addEventListener(
'click',
(e) => {
console.log('btn click')
},
{ capture: true }
)
box.addEventListener(
'click',
(e) => {
console.log('box click')
},
{ capture: true }
)
</script>
输出(和冒泡顺序相反)
box click
btn click
利用事件冒泡可以实现事件委托,简化代码
简单的事件监听
<div id="box">
<button id="buttonA">点击A</button>
<button id="buttonB">点击B</button>
</div>
<script>
const buttonA = document.querySelector('#buttonA')
const buttonB = document.querySelector('#buttonB')
buttonA.addEventListener('click', (e) => {
console.log('buttonA click')
})
buttonB.addEventListener('click', (e) => {
console.log('buttonB click')
})
</script>
使用事件委托,仅用监听外层元素的事件
<div id="box">
<button id="buttonA">点击A</button>
<button id="buttonB">点击B</button>
</div>
<script>
const box = document.querySelector('#box')
box.addEventListener('click', (e) => {
// 事件触发元素 buttonA / buttonB
console.log(e.target)
// 获取元素id属性
let targetId = e.target.getAttribute('id')
console.log(targetId)
// 处理元素 box
console.log(e.currentTarget)
})
</script>