常用事件表
名称 | 触发 |
---|---|
load | 页面(包括CSS样式 图片 JS等资源)完全加载后触发(window可用) |
DOMContentLoaded | HTML文档被加载后触发,无需等待图片 js CSS资源加载(window和document可用) |
beforeunload | 窗口被关闭/刷新(可阻止) |
unload | 文档被卸载后(window) |
abort | 图像/视频/音频加载被中断 |
error | 文档/图像加载错误 |
resize | 调整窗口大小(window) |
scroll | 页面滚动(window) 可用document.documentElement.scrollTop获取滚动距离 |
focusin | 获得焦点(冒泡) |
focus | 获得焦点(不冒泡) |
focusout | 失去焦点(冒泡) |
blur | 失去焦点(不冒泡) |
mouseover | 鼠标移动到元素上(冒泡) |
mouseenter | 鼠标移动到元素上(不冒泡) |
mouseout | 鼠标移出元素(冒泡) |
mouseleave | 鼠标移出元素(不冒泡) |
mousedown | 鼠标键按下 |
mouseup | 鼠标键松开 |
click | 鼠标单击 |
dblclick | 鼠标双击 |
mousemove | 鼠标移动 |
contextmenu | 调出上下文菜单(鼠标单击右键) |
mousewheel | 鼠标滚轮滚动(非标准事件) |
keydown | 键盘任意键被按下/按住 |
keypress | 键盘字符键被按下/按住 |
keyup | 键盘任意键被松开 |
input | 用于input/textarea元素,用户输入时触发 |
change | 元素值发生变化(例如select更改选项,input输入框输入) |
submit | 提交按钮被点击 |
reset | 重置按钮被点击 |
copy | 用户复制内容 |
haschange | URL参数(#号后的内容)变化时触发(window可用) |
event
属性 | 内容 |
---|---|
preventDefault() | 阻止默认事件 |
stopPropagation() | 阻止继续捕获/冒泡 |
stopImmediatePropagation() | 阻止继续捕获/冒泡,绑定在同一元素上的其他事件也被阻止 |
clientX clientY | 鼠标坐标(相对于视口) |
pageX pageXY | 鼠标坐标(相对于视页面) |
screenX screenY | 鼠标坐标(相对于屏幕) |
shiftKey | Shift键是否被按下 |
ctrlKey | Ctrl键是否被按下 |
altKey | Alt键是否被按下 |
metaKey | Windows/Cmd键是否被按下 |
relatedTarget | 鼠标从哪个元素移入/移出到哪个元素(仅mouseover mouseout可用) |
button | 鼠标按下/释放的键,左键:0 滚轮:1 右键:2 |
detail | 短时间内点击次数 |
wheelDelta | 鼠标滚轮滚动,向前滚动返回: wheelDelta120,向后返回wheelDelta-120(mousewheel可用) 注: 120不是指滚动的距离 |
key | 返回按键名或输入字符,例如"Shift" "A" |
keyCode | keydown/keyup中调用返回按键ASCII码,keypress中调用返回输入文字的ASCII码 |
charCode | 返回按键ASCII码(仅keypress可用,其它事件调用返回0) |
which | 同keyCode |
location | 按键所处位置, 默认键盘: 0 左侧键盘: 1 右侧键盘: 2,数字键盘: 3 虚拟键盘: 4 手柄: 5 |
oldURL | 旧URL(hashchange可用) |
newURL | 新URL(hashchange可用) |
事件
onload
也可以在img和script元素上触发onload事件
1 | img.addEventListener('load', function(e){ |
注: img元素会在添加src属性时开始下载图片,而script元素添加到文档后才开始下载文件
onclick
只能绑定一次,先绑定的会被后绑定的覆盖,不需要去掉事件名前头的"on"
element.onclick = function
document.body.onclick = function(){
alert(this);
}
//body...
其他事件同上,例如
//鼠标移动时,获取鼠标坐标
window.onmousemove = function(){
console.log(`${event.clientX},${event.clientY}`)
};
oninput
用于input/textarea元素,当用户输入时触发.
//检测用户输入密码长度,小于5位提示密码不安全
<div class="container-9">
<input type="password">
<span></span>
</div>
var input = document.querySelector('.container-9 input');
var span = document.querySelector('.container-9 span');
input.oninput = function(){
span.innerText = '';
if (input.value.length < 5) {
span.innerText = "密码太短"
} else {
span.innerText ="密码安全"
}
}
onchange
当元素值(value)改变时触发,例如radio/checkbox/select/状态改变,input/textarea输入结束
类似oninput,区别是oninput立刻触发,而onchange失去焦点后才触发
onscroll
document.onscroll = function(){
//获取滚动条到页面顶部的距离
console.log(window.pageYOffset);
};
可用于向下滚动一定距离后,添加导航条/返回顶部按钮
例如向下滚动100px,修改背景颜色
window.onscroll = function() {myFunction()};
function myFunction() {
if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) {
document.body.style.background = "yellow";
}
}
oncontextmenu
当用户单击鼠标右键时激活事件,可用于屏蔽鼠标右键
window.oncontextmenu = function(){
return false;
}
onmouseenter 和 onmouseover的区别
两个事件都会在鼠标移入元素时激活.
当元素中没有子元素,两个事件所表现的效果是一样的.
如果元素中有子元素,鼠标从元素移动到子元素上,或从子元素移动到另一个子元素时,onmouseover会被多次激活.
而onmouseenter只会在移入元素时激活.
下边的这两个方块分别绑定了onmouseenter和onmouseover,可以把鼠标移动到元素/子元素上观察效果.
onbeforeunload onunload的区别
两个事件都会在页面被关闭/刷新时激活,
区别是onbeforeunload可以阻止页面被关闭,而onunload不行
// 当用户关闭页面时,弹出选择框询问是否关闭
window.onbeforeunload = function(){
// 如需需返回 true/任意字符(空字符串也行),如 return''
// 只写return或返回false/null不会有任何效果,如 return null
return true;
}
html5规定忽略onbeforeunload调用函数中的弹窗方法
// 下边的弹窗无效
window.onbeforeunload = function(){
alert(''); //Blocked alert('') during beforeunload.
}
应慎用onbeforeunload,死循环会导致窗口无法关闭,甚至可能连浏览器都关不了.
// 死循环导致页面失去响应
var counter = 0;
window.onbeforeunload =function(){
while(true) {
console.log(counter++);
}
}
onunload可与ajax结合,备份页面关闭时未保存的数据.
// 关闭页面后修改cookies
window.onunload = function(){
document.cookie ="test";
}
绑定事件
addEventListener
向元素添加添加事件,可对同一个元素绑定多个事件,不支持ie8及以下浏览器
element.addEventListener(event, function);
var body = document.body;
body.addEventListener('click', function(){alert('')});
事件名应去掉开头的"on",例如
//正确
body.addEventListener('click', function(){alert('')});
//错误
body.addEventListener('onclick', function(){alert('')});
所调用函数中的this指向被绑定元素本身
如下所示,给容器元素绑定click事件,点击容器内子元素,事件仍可正常执行.且this指向容器本身,而非触发事件的子元素.
<div class="contain-1" style="border:1px solid;">
<div style="width:100px;height:50px;background:yellow;"></div>
</div>
var node = document.querySelector('.contain-1');
node.addEventListener('click', function(event){
alert(this.classList); // contain-1
})
可利用闭包储存变量
var temp = 1;
document.body.addEventListener('click', (function(){
var that = temp ;
return function(){
alert(that);
}
})())
var temp =2;
//1
removeEventListener
移除addEventListener 方法绑定的事件,不支持ie8及以下.
element.removeEventListener(event, function)
var event = () => alert('');
//绑定点击事件
document.body.addEventListener('click', event);
//移出点击事件
document.body.removeEventListener('click', event);
注意 removeEventListener方法无法移除匿名函数
例如向body添加点击事件后尝试移除事件.但无效果,点击页面还是会弹出alert.
document.body.addEventListener('click', function(){alert('')});
document.body.removeEventListener('click', function(){alert('')});
attachEvent detachEvent
类似addEventListener,但只支持ie(edge也不支持)
element.attachEvent(event,function)
可对同一个元素绑定多个事件,需去掉事件名前的"on"
document.body.attachEvent('onclick', function(){alert('')});
addEventListener中的this指向元素自身,而attachEvent中的this指向全局对象(window)
document.body.attachEvent('onclick', function(){alert(this)}); //window
绑定事件
addEventListener
向元素添加添加事件,可对同一个元素绑定多个事件,不支持ie8及以下浏览器
element.addEventListener(event, function);
var body = document.body;
body.addEventListener('click', function(){alert('')});
事件名应去掉开头的"on",例如
//正确
body.addEventListener('click', function(){alert('')});
//错误
body.addEventListener('onclick', function(){alert('')});
所调用函数中的this指向被绑定元素本身
如下所示,给容器元素绑定click事件,点击容器内子元素,事件仍可正常执行.且this指向容器本身,而非触发事件的子元素.
<div class="contain-1" style="border:1px solid;">
<div style="width:100px;height:50px;background:yellow;"></div>
</div>
var node = document.querySelector('.contain-1');
node.addEventListener('click', function(event){
alert(this.classList); // contain-1
})
可利用闭包储存变量
var temp = 1;
document.body.addEventListener('click', (function(){
var that = temp ;
return function(){
alert(that);
}
})())
var temp =2;
//1
removeEventListener
移除addEventListener 方法绑定的事件,不支持ie8及以下.
element.removeEventListener(event, function)
var event = () => alert('');
//绑定点击事件
document.body.addEventListener('click', event);
//移出点击事件
document.body.removeEventListener('click', event);
注意 removeEventListener方法无法移除匿名函数
例如向body添加点击事件后尝试移除事件.但无效果,点击页面还是会弹出alert.
document.body.addEventListener('click', function(){alert('')});
document.body.removeEventListener('click', function(){alert('')});
attachEvent detachEvent
类似addEventListener,但只支持ie(edge也不支持)
element.attachEvent(event,function)
可对同一个元素绑定多个事件,需去掉事件名前的"on"
document.body.attachEvent('onclick', function(){alert('')});
addEventListener中的this指向元素自身,而attachEvent中的this指向全局对象(window)
document.body.attachEvent('onclick', function(){alert(this)}); //window
Event
chrome和ie会默认传入一个event,但firefox不会.例如下代码能在chrome里正常执行,但firefox会报错
window.onclick = function(){
alert(event.clientX);
}
event.clientX | event.clientY
返回事件触发时的鼠标位置
相对浏览器窗口计算,不考虑页面滚动
document.body.addEventListener('click', function(event){
alert(event.clientX);
})
event.target
返回触发事件的元素
父元素内有一50x50px子元素,用鼠标点击子元素,可看到target和this的指向不同元素.
<div class="container-9" style="border:1px solid;width:50px;">
<div class="child-9" style="background:#aaa;height:50px;"></div>
</div>
var node = document.querySelector('.container-9');
node.onclick = function(event){
// target指向触发事件的元素,而this指向绑定事件的元素
alert('event.target ' + event.target.classList); //"child-9"
alert('this ' + this.classList); // "container-9"
}
event.which
触发onkeypress事件时,返回按键的unicode code.
触发onkeydown/onkeyup事件时,返回按键的Unicode key code
unicode code和Unicode key code的区别
字符A和a的unicode code值分别为65和97,但Unicode key code都是65.
event.key
触发键盘事件时,返回所按键字符
返回值有两类
- 单个字符,例如 a A 1 !
- 多字符,例如 Enter F1