事件总结

DOM事件主要内容

  • 事件流
  • 事件注册
  • 事件对象
  • 事件分类
  • 事件代理

什么是DOM事件?

  • 事件是某个行为或者触发,比如点击、鼠标移动
  • 当用户点击鼠标时
  • 当网页已加载时
  • 当图像已加载时
  • 当鼠标移动到元素上时
  • 当用户触发按键时...

事件流

事件流
事件流
  • capture phase捕获事件
    • 事件对象通过目标的祖先从传播窗口到目标的父。这个阶段也被称为捕获阶段
  • target phase
    • DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段
  • bubble phase 冒泡
    • IE的事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素

参考资料: 事件流


事件注册与触发

在讲述事件注册之前,讲一下前面的事件处理程序

  • HTML内联方式
    • 存在加载顺序问题,如果事件处理程序在html代码之后加载,用户可能在事件处理程序还未加载完成时就点击按钮之类的触发事件,存在时间差问题
    • 这样书写html代码和JavaScript代码紧密耦合,维护不方便
<input type="button" value="Click Here" onclick="alert('Clicked!');" />
  • JavaScript指定事件处理程序
    • 把一个方法赋值给一个元素的事件处理程序属性。
    • 可以删除事件处理程序,只需把元素的onclick属性赋为null即可
<input id="btnClick" type="button" value="Click Here" />

<script type="text/javascript">
    var btnClick = document.getElementById('btnClick');
    btnClick.onclick = function showMessage() {
        alert(this.id);
    };
</script>

事件注册(DOM2事件处理程序)

  • eventTarget.addEventListener(type,listener[,useCapture])
    • 事件类型
    • 事件处理方法
    • 布尔参数,如果是true表示在捕获阶段调用事件处理程序,如果是false,则是在事件冒泡阶段处理
var elem = document.getElementById("div1")
var clickHandler = function(){
  //to do
}
elem.addEventListener('click',clickHandler,false)

取消事件注册

  • eventTarget.removeEventListener(type,listener[,useCapture])
    • 事件类型
    • 事件处理方法
    • 布尔参数,如果是true表示在捕获阶段调用事件处理程序,如果是
elem.removeEventListener('click',clickHandler,false)
elem.onclick = null

事件触发

  • eventTarget.dispatchEvent(type)
elem.dispatch("click")
浏览器兼容性(IE6 7 8)

事件注册与取消

IE并不支持addEventListener和removeEventListener方法,而是实现了两个类似的方法

  • attachEvent
  • detachEvent
    这两个方法都接收两个相同的参数
    • 事件处理程序名称
    • 事件处理程序方法

事件触发

  • fireEvent(e)

no capture没有捕获

兼容性

事件对象(共有的)

当事件被触发的时候,会调用事件处理函数,在调用时间处理函数中,有一些信息,这些信息代表着事件的状态,这个就是事件对象

click为例

  • 属性
    • type类型:例如点击什么的...
    • target(srcElement IE低版本)目标元素,点击哪个就是那个
    • currentTarget:事件处理程序当前处理元素
  • 方法
    • stopPropagation()取消事件进一步捕获或冒泡
    • preventDefault()取消事件默认行为

阻止事件传播(冒泡)

  • event.stopPropagation()W3C
  • event.cancelBubble=trueIE

默认行为

  • event.preventDefault()W3C
  • event.returnValue = false IE

事件分类

事件种类

MouseEvent

事件类型 是否冒泡 元素 默认事件 元素例子
click(点击) Yes element focus/activation div
dbclick(双击) Yes element focus/activation div
mousedown Yes element drag/scroll text selection div
mousemove Yes element None div
mouseout鼠标离开 Yes element None div
mouseover鼠标移上去,进入子元素也会触发 Yes element None div
mouseup Yes element context menu div
mouseenter鼠标移上去 No element None div
mouseleave鼠标离开 No element None div

MouseEvent对象

  • 属性
    • clientX, clientY位置
    • screenX, screenY
    • ctrlKey,shiftKey,altKey,metaKey
    • button(0,1,2)鼠标左键还是右键还是滚轮

MouseEvent事件顺序

顺序

WheelEvent滚轮事件

事件类型 是否冒泡 元素 默认事件 元素例子
wheel Yes element scroll or zoom document div

FocusEvent 元素获得焦点和失去焦点

事件类型 是否冒泡 元素 默认事件 元素例子
blur(失去焦点) No Window,element None window,input
focus(获得焦点) No Window,element None window,input
focusin(即将获得焦点) No Window,element None window,input
focunsout(即将失去焦点) No Window,element None window,input
  • 属性
    • relatedTarget当一个元素失去焦点,另一个元素就会获得焦点
事件类型 是否冒泡 元素 默认事件 元素例子
beforeinput Yes Element Update DOM Element input
input Yes element None input

InputEvent 输入事件(W3C)

事件类型 是否冒泡 元素 默认事件 元素例子
beforeinput Yes Element Update DOM Element input
input Yes element None input
  • onpropertychange(ie)

KeyboardEvent键盘事件

事件类型 是否冒泡 元素 默认事件 元素例子
keydown Yes Element input bulr/focus input
keyup按下去松开触发 Yes element None input
  • 属性
    • key按下什么键,值是字符串
    • code
    • ctrlKey,shiftKey,altKey,metaKey
    • repeat持续按一个键

Event

事件类型 是否冒泡 元素 默认事件 元素例子
load(事件加载) NO Window,document,element None window,image,iframe
unload(类似页面退出) No Window,document,element None window
error(加载错误) NO Window,element None window,image
select(input被选择..) NO element None input,textarea
abort(esc) NO window,element None window,image
window对象 Image
load load
unload error
error abort
abort
<image alt = "photo" src = "www.baidu.com" onerror = "this.src = 'www.wangyi.com'"/>

UIEvent

事件类型 是否冒泡 元素 默认事件 元素例子
resize(窗体大小) NO Window,element None window,iframe
scroll(页面滚从) NO/Yes Document,element None document,div

事件代理

参考我写的另一片文章 从onClick谈事件代理和了解事件传播机制

总结一下不能冒泡的事件:

  • mouseenter
  • mouseleave
  • blur
  • focus
  • focusin
  • focusout
  • load
  • unload
  • error
  • select
  • abort
  • resize
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • JavaScript 程序采用了异步事件驱动编程模型。在这种程序设计风格下,当文档、浏览器、元素或与之相关的对象发...
    劼哥stone阅读 1,249评论 3 11
  • 什么是事件: 事件是交互体验的核心功能 一.事件冒泡: 当一个事件发生时,这个事件会从内向外逐层传递。 二.为什么...
    轻描淡写mua阅读 509评论 0 0
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 3,021评论 1 10
  • 什么是事件? JavaScript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定...
    LeeoZz阅读 173评论 0 0
  • 是坚决不了的可否与否 欲沉不沉的残阳似够不够 皲裂开来的眼眸 掺和着你的影子佝偻 像风衣的袋子不愁也愁 本是一纸的...
    FTHEG阅读 235评论 0 0