事件绑定
ele.onxxx = function (event) {} //句柄的绑定方式
例 div.onclick = function(){}
div.onclicck 就叫做可以被点击的事件(绑定事件类型),function(){}是反馈,一旦事件被触发,就要执行 function 里面的函数(绑定的是一个事件处理函数)
ele.addEventListener(type, fn, false); //里面可以填三个参数
//IE9 以下不兼容,可以为一个事件绑定多个处理程序
//div.addEventListener(’事件类型’,处理函数,false)div.addEventListener(‘click’,function(){},false)
//不会覆盖,是一个队列 on会后面覆盖前面的
function f1(){
console.log(1)
}
function f2(){
console.log(2)
}
images.addEventListener('click',f1)
images.addEventListener('click',f2)
images.removeEventListener('click',f1)
//1
//2
尽量使用**addEventListener**
,而不是**on**
ele.attachEvent(‘on’ + type, fn);
IE 独有,一个事件同样可以绑定多个处理程序,同一个函数绑定多次都可以
例 div.attachEvent(‘on’ + 事件类型,处理函数);
div.attachEvent(‘onclick’ ,function(){});
事件处理程序的运行环境
程序 this 指向是 dom 元素本身(指向自己)
解除事件处理程序
1、ele.onclick = false/‘’/null; ==> 解除 ele.onxxx = function (event) {}
2、ele.removeEventListener(type, fn, false);==>解除 addEventListener(type, fn, false)
3、ele.detachEvent(‘on’ + type, fn); ==> obj.attachEvent(‘on’ + type, fn);
事件处理模型 冒泡 捕获
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div{
border: 1px solid;
padding: 10px;
}
</style>
</head>
<body>
<div id="grand1">
爷爷
<div id="parent1">
爸爸
<div id="child1">
儿子
</div>
</div>
</div>
<script>
grand1.addEventListener('click',()=>{
console.log("爷爷")
},true)
parent1.addEventListener('click',()=>{
console.log("爸爸")
})
child1.addEventListener('click',()=>{
console.log("儿子")
})
//爷爷 儿子 爸爸
//默认从内到外执行 儿子 爸爸 爷爷 冒泡
//addEventListener第3个参数可以传true,就先执行外面的 爷爷 爸爸 儿子 捕获
//先捕获再冒泡
//如果自身既有冒泡也有捕获,按代码顺序
</script>
</body>
</html>
冒泡
结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)
结构上存在父子关系的元素,如果点击到子元素,会一级级向父元素传递这个事件(从代码的角度是自底向上一层层冒泡的)
捕获
1)结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自底向上)
2)IE 没有捕获事件
一个对象的一个事件类型,只能存在一个事件处理模型(冒泡或捕获)
obj.addEventListener(type, fn, true);第三个参数为 true 就是事件捕获
顺序
取消冒泡和阻止默认事件
取消冒泡
1)W3C 标准 event.stopPropagation();但不支持 ie9 以下版本
2)IE 独有 event.cancelBubble = true;【实际上谷歌也实现了】
3)封装取消冒泡的函数 stopBubble(event)
阻止默认事件
1)默认事件 — 表单提交,a 标签跳转,右键菜单等
事件对象
非 ie 浏览器会把事件对象(记载了数据发生时的状态和信息)打包传到参数里面去。
ie 浏览器在 window.event 里面储存事件对象
事件源对象
event.target 火狐独有的
event.srcElement Ie 独有的
这俩 chrome 都有
事件委托
事件分类
鼠标事件(不需要小驼峰和大驼峰)
click、mousedown、mousemove、mouseup、contextmenu、mouseover、mouseout、mouseenter、 mouseleave
用 button 来区分鼠标的按键,0/1/2
DOM3 标准规定:click 事件只能监听左键,只能通过 mousedown 和 mouseup 来判断鼠标所有键
如何解决 mousedown 和 click 的冲突
移动端 onmousedown 不能用,只能用 touchstart,touchmove,touchend
键盘事件
1、keydown,keyup,keypress
2、触发顺序是 keydown > keypress > keyup,keypress不同于onclick,和keydown,keyup没关系
3、keydown 和 keypress 的区别
1)keydown 可以响应任意键盘按键,keypress 只可以相应字符类键盘按键
keydown 检测字符类不准确,keypress 检测字符很准。但是 keydown 能监控所有,包括上下
左右都能监控,但是 keypress 只能监视字符
用法:如果你想监控字符类按键,并想区分大小写,就用 keypress,如果是操作类按
键的话,就用 keydown(which:39 是给按键牌号 39,不是 asc 码)
文本操作事件
input,change,focus,blur
框里面所有变化(增删改)都会触发 input 事件
change 对比鼠标聚焦,或失去焦点的时,两个状态是否发生改变,如果两个状态
没有改变就不触发,如果发生改变就触发
focus,blur 聚焦和失去焦点
窗体操作类(window 上的事件)
scroll,load
scroll 当滚动条一滚动,scroll 事件就触发了
load 重要但是不用