(记录自己在网上学习的一些资料,方便后面复习,如有侵权可删!)
8 事件(高级事件)
给元素添加事件, 称为注册事件或者绑定事件。
注册事件有两种方式:传统方式和方法监听注册方式。
1 传统注册方式
● 利用 on 开头的事件 onclick
● <button onclick = ''alert('hi~')''>
● btn.onclick = function(){}
● 特点: 注册事件的唯一性
● 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数会覆盖前面注册的处理函数。
方法监听注册方式
● w3c 标准 (推荐方式)
● addEventListener() 它是一个方法
● IE9 之前的IE不支持此方法,可使用 attachEvent()代替
● 特点:同一个元素同一个事件可以注册多个监听器
● 按注册顺序依次执行
2 删除事件(解绑事件)
1 传统注册方式
eventTarget.onclick = null;
2 方法监听注册方式
① eventTarget.removeEventListener(type, listener, [, useCapture]);
② eventTarget.detachEvent(eventNameWithOn, callback);
3 DOM 事件流
事件流 描述的是从页面中接收事件的顺序。
事件阿生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM事件流。
DOM 事件流分为3个阶段:
1 捕获阶段
2 当前目标阶段
3 冒泡阶段
事件冒泡:IE最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点的过程。
事件捕获:网景最早提出,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程。
注意:
-
JS代码中只能执行捕获或者冒泡其中的一个阶段。
-
onclick 和 attachEvent 只能得到冒泡阶段。
-
addEventListener(type, listener[, useCapture]第三个参数如果是true, 表示在事件捕获阶段调用事件处理程序;如果是false(不写默认是false),表示在事件冒泡阶段调用事件处理程序。)
-
实际开发中很少使用事件捕获,主要更关注事件冒泡。
-
有些事件是没有冒泡的,比如onblur、onfocus、onmouseenter、onmouseleave
-
事件冒泡有时候带来麻烦,有时候很方便做某事件。
e.target 和 this的区别
- e.target 返回的是触发事件的对象(元素)
- this 返回的是绑定事件的对象(元素)
阻止事件冒泡(面试题常考)
(标准写法,常用)
- 阻止冒泡 dom 推荐的标准 stopPropagation()
eg:e.stopPropagation()
- e.cancelBubble = true; (非标准写法,不推荐,使用IE6-8)
事件委托(代理、委派)
事件委托也称事件代理,在jQuery里面称为事件委派。
事件委托原理(重点,面试常考):
不是每个子节点单独设置事件监听器,而是把事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。(事件冒泡的优点)
事件委托作用:
只操作一次DOM,提高了程序的性能。
获取鼠标在页面中的坐标
-
client 鼠标在可视区的x和y的坐标
e.clientX
e.clientY
-
page 鼠标在页面文档的x和y坐标 (常用)
e.pageX
e.pageY
-
screen 鼠标在电脑屏幕的x和y坐标
e.screenX
e.screenY