Dom事件

133 阅读6分钟

事件

事件,就是函数在某种状态下被调用.JS捕捉到的发生在网页上的行为,官方称为事件句柄,是交互体验的核心功能

事件的三要素: 1 事件源 2 事件类型 3 事件处理程序

绑定事件

1.行内绑定方式 在标签行内 的事件值上写上标志"javaScript:后跟js代码"

<a href="javaScript:alert(666)">点我</a>
<a href="javaScript:void(0)">点我</a>
<button onclick="javaScript:alert(666)">点我</button>

2.元素属性绑定方式

ele.onxxx=function(event){}
//兼容性很好,但是一个元素的同一个时间上只能绑定一个处理程序
//句柄式写法,基本等同于写在HTML行间上

3.同元素多处理程序绑定方式1

obj.addEventListener(type,fn,false)
//IE9以下不兼容,可以为一个事件绑定多个处理程序
//第三个参数表示是否捕获阶段触发,跟冒泡没关系(笔试陷阱题)

4.同元素多处理程序绑定方式2

obj.attachEvent('on'+type,fn);
//IE专有( ie11例外),一个事件同样可以绑定多个处理程序
// <meta http-equiv="X-UA-Compatible" content="IE=10" />,解决 IE11向后兼容 IE10的问题

5.多元素同事件同处理程序绑定方式==>代理模式

​
box.onclick=function(e) {
    e.target
}
//父元素绑定事件  通过事件对象来区分用户触发的事件属于哪一个具体的对象

事件解绑

1、ele.onclick=false/''/null;

2、ele.removeEventListener(type,fn,false);

3、ele.detachEvent("on"+type,fn);

ps:2,3若绑定的是匿名函数,则永远无法解除

事件中的this和事件对象

1.行内:

<button type="button" onclick="fn(this)">xxx</button>
<script type="text/javascript">
        function fn (e) {
            console.log(e,this)//btn和window
        }
</script>
//行内绑定时  行内的环境对象是btn  函数的调用者是window 无法获取事件对象

2.元素属性: this指向的是dom元素本身 事件对象在参数中

3.addEventListener: this指向的是dom元素本身 事件对象在参数中

4.attachEvent: this指向 window 事件对象在参数中

事件响应链

event.png 1.事件的三个阶段: 先捕获,后目标,再冒泡,只能有一个阶段触发程序执行,比如捕获阶段触发了到了冒泡阶段就不再触发

事件经过所有元素都没有被处理,这个事件消失

事件传递的过程 只跟文档树的结构有关系 跟界面显示的层叠效果没有任何关系

事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)

事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自顶向下)

2.默认在冒泡的时候执行事件:onclick/attach和 addEventListener传false的时候

3.addEventListener绑定事件,如果把第三个参数设置为true,则在捕捉的时候执行事件

3.整个事件处理过程,会有个event事件对象在整个事件过程传播(W3C标准,ie8及其以下没有)

4.ie8以下不支持addEventListener

5.focus,blur,change,submit,reset,select等事件不冒泡

阻止冒泡和系统默认事件

1、阻止事件冒泡: W3C标准 event.stopPropagation();但不支持 ie9以下版本

stopImmediatePropagation() 支持stopPropagation的浏览器中也可以用stopImmediatePropagation()方法,这个不仅会阻止事件向祖元素的冒泡,也会阻止同一个节点上同一事件的其他的事件处理程序(优先级比它低的,同元素同事件多处理程序时)

event.cancelBubble=true; ie8及ie8以下可用

2、阻止默认事件: 默认事件——表单提交,a标签跳转,右键菜单等等

return false; 以对象属性的方式注册的事件才生效,用addEventListener/attachEvent这种是不生效的

event.preventDefault(); W3C标准,IE9以下不兼容

event.returnValue=false;兼容IE ​

事件类型

鼠标事件

1、click、 mousedown、mousemove、mouseup、dblclick、 contextmenu、mouseover、mouseout、mouseenter(html5标准)、mouseleave(html5标准) a) mousedown-->mouseup-->click b) mousedown是鼠标按下一次就只触发一次; c) mousemove与 mousedown无关,相互独立; d) 补充:移动端没有 mousedown事件,对应的是 touchstart--touchmove--touchend

2、DOM3标准规定:click事件只能监听左键,mousedown和 mouseup来判断鼠标键,event.button来区分鼠标的按键,0/1/2

键盘事件

1、keydown、keyup、keypress a) keydown-->keypress-->keyup b) keydown在按键按下之后会一直不断被触发

2、keydown和 keypress的区别 a) keydown可以响应任意按键(除了Fn键),keypress只可以响应字符类键盘按键(event.charCode) b)keypress返回 ASCII码,可以转换成相应字符(String.fromCharCode(event.charCode),区分大小写) // keydown常用于绑定操作类事件处理,keypress常用于绑定字符类事件处理

输入框操作事件

1、input、focus、blur、change a) input监听 input框在聚焦状态下的文本变化,例:百度搜索 b) change监听 input框在失焦后的文本变化(与前一次失焦状态的文本对比变化) c) focus和blur只在聚焦和失焦的一刻触发一次

其他事件

1、scroll scroll:常用于绑定在window对象上,滚动鼠标时触发 window.onscroll=func

//wheel 它是鼠标的

2、load load:等待网页资源下载完毕再执行

img.onload 图片节点加载完毕不会调用 要资源加载完毕就会调用

window.onload:等待页面所有资源下载完成才执行,包括图片资源的下载,所以它是最慢的 ​ 网页加载顺序:url-->下载页面-->domTree,cssTree并行-->渲染树renderTree-->绘制页面-->继续下载图片资源,下载完毕再放到页面上去onload domTree:domTree的形成,是先把元素翻译成的节点对象挂到 domTree上去,再把属性 img_src放到渲染树上去

事件对象

事件对象

事件对象上存储着事件发生时的相关信息(例如:event.which)

a) 事件处理函数形参ev(event),W3C制定的标准,IE9以下不行
b) 全局对象 window.event用于IE9以下
// 兼容性写法 var event= ev|| window.event
事件对象携带的信息

事件源对象:

    event.target    火狐只有这个
    event.srcElement    IE6/78只有这个
    这两个chrome都有 
    兼容性写法 var ele=event.target|| event.srcElement

鼠标事件触发时:

altKey 鼠标事件发生时,是否按下alt键,返回一个布尔
ctrlKey 鼠标事件发生时,是否按下ctrl键,返回一个布尔
metaKey  鼠标事件发生时,是否按下windows/commond键,返回一个布尔
shiftKey 鼠标事件发生时,是否按下shift键,返回一个布尔
pageX  鼠标点击的  X 坐标;(包含body隐藏的)
pageY  鼠标点击的  Y 坐标;(包含body隐藏的)
clientX clientY返回鼠标位置相对于浏览器窗口左上角的坐标,单位为像素(不包括body隐藏的)
screenX screenY返回鼠标位置相对于屏幕左上角的坐标,单位为像素
movementX,movementY返回一个位移值,单位为像素,表示当前位置与上一个mousemove事件之间的距离
offsetX/offsetY 相对于元素自己的x/y 跟它是否是定位的元素无关

键盘事件触发时:

charCode/keyCode  键码值  key  键码
37左
38上
39右
40下 
13enter
​

媒体和图形编程 自己去百度 音频视频操作 //H5给提供了两个标签 还提供了一些js的API 来操作视频和音频 canvas图形绘制 //金融 医疗 教育 游戏等等 svg矢量图编程 //