【笔记】JS事件模型再复习之笔记
2016-07-26 23:58
453 查看
写在前面:这已经是第四次翻红宝书复习JS事件模型了,之前有记过笔记在笔记本上,但是每次读完书都没有沉下心来写代码实现。最近在跟学长做项目,真的上手才发现很多细节都只记得个大概,于是决定再次阅读,写在博客里。
----------
DOM事件流
事件冒泡:IE的事件流叫做事件冒泡(event bubbling)
所有线代浏览器都支持事件冒泡,IE5.5及更早版本中的时间傲跑会跳过<html>元素(从<body>直接跳到<document>)。IE9, FireFox,Chrome和Safari则将事件冒泡到window对象。
事件捕获:
虽然事件捕获是Netscape Communicator唯一支持的事件流模型,但是IE9, Safari, Chrome, Opera和FireFox目前都支持这种事件流模型,尽管DOM2级时间规范要求事件应该从document对象开始传播,但这些浏览器都是从window对象开始捕获事件的。
在DOM事件流中,
1. 捕获阶段:实际的目标在捕获阶段并不会接收到事件。这意味着在捕获阶段,事件从document到目标的父元素就停止了;
2. 处于目标阶段:事件在目标上发生,并在事件处理中被看成冒泡阶段的一部分;
3. 冒泡阶段:事件传播回文档
----------
DOM 0级事件处理程序
使用DOM0级方法指定的事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在元素作用域中进行的,换句话说,程序中的this引用当前元素。
DOM 2级事件处理程序
addEventListener()的第三个参数是一个布尔值,如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。使用该元素添加的事件处理程序也是其依附的元素的作用域中运行。
使用addEventListener()添加的事件处理程序只能用removeEventListener()来移除。移除时传入的参数与添加处理程序时使用的参数相同。这意味着addEventListener()添加的匿名函数将无法移除。
在大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各浏览器,最好只在需要事件到达目标前截获它的时间将事件处理程序添加到捕获阶段。
----------
IE事件处理程序
在IE中使用attachEvent()与使用DOM0级方法的主要区别在于事件处理程序的作用域。在attachEvent()方法的情况下,事件处理程序会在全局作用域中运行,因此this等于window。
----------
DOM中的事件对象:event
属性 类型 明
bubbles Boolean
表明事件是否冒泡。如果为true,则可设置stopPropagation()
cancelable Boolean
表明是否可以取消事件的默认行为。如果为true,则可设置preventDefault()
currentTarget Element
其事件处理程序当前正在处理事件的那个元素
defaultPrevented Boolean
为true表示已经调用了preventDefault()
detail Integer
eventPhase Integer
事件处理程序的阶段:1表示捕获阶段,2表示处于目标,3表示冒泡阶段
preventDefault() Function
取消事件的默认行为
stopImmediatePropagation() Function 取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用
stopPropagation() Function
取消事件的进一步冒泡或捕获。
target Element
事件的目标
type String 触发事件的类型
在事件处理程序的内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。
只有在事件处理程序执行期间,event对象才会存在;一旦事件处理程序执行完成,event对象就会被销毁
----------
IE事件对象属性与DOM的对比
IE DOM
cancelBubble stopPropagation()
returnValue preventDefault()
srcElement target
注:cancelBubble只能取消事件冒泡,而stopPropagation()可以取消冒泡和捕获
----------
跨浏览器的事件对象:
----------
DOM事件流
事件冒泡:IE的事件流叫做事件冒泡(event bubbling)
所有线代浏览器都支持事件冒泡,IE5.5及更早版本中的时间傲跑会跳过<html>元素(从<body>直接跳到<document>)。IE9, FireFox,Chrome和Safari则将事件冒泡到window对象。
事件捕获:
虽然事件捕获是Netscape Communicator唯一支持的事件流模型,但是IE9, Safari, Chrome, Opera和FireFox目前都支持这种事件流模型,尽管DOM2级时间规范要求事件应该从document对象开始传播,但这些浏览器都是从window对象开始捕获事件的。
在DOM事件流中,
1. 捕获阶段:实际的目标在捕获阶段并不会接收到事件。这意味着在捕获阶段,事件从document到目标的父元素就停止了;
2. 处于目标阶段:事件在目标上发生,并在事件处理中被看成冒泡阶段的一部分;
3. 冒泡阶段:事件传播回文档
----------
DOM 0级事件处理程序
使用DOM0级方法指定的事件处理程序被认为是元素的方法。因此,这时候的事件处理程序是在元素作用域中进行的,换句话说,程序中的this引用当前元素。
DOM 2级事件处理程序
addEventListener()的第三个参数是一个布尔值,如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。使用该元素添加的事件处理程序也是其依附的元素的作用域中运行。
使用addEventListener()添加的事件处理程序只能用removeEventListener()来移除。移除时传入的参数与添加处理程序时使用的参数相同。这意味着addEventListener()添加的匿名函数将无法移除。
在大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各浏览器,最好只在需要事件到达目标前截获它的时间将事件处理程序添加到捕获阶段。
----------
IE事件处理程序
在IE中使用attachEvent()与使用DOM0级方法的主要区别在于事件处理程序的作用域。在attachEvent()方法的情况下,事件处理程序会在全局作用域中运行,因此this等于window。
----------
DOM中的事件对象:event
属性 类型 明
bubbles Boolean
表明事件是否冒泡。如果为true,则可设置stopPropagation()
cancelable Boolean
表明是否可以取消事件的默认行为。如果为true,则可设置preventDefault()
currentTarget Element
其事件处理程序当前正在处理事件的那个元素
defaultPrevented Boolean
为true表示已经调用了preventDefault()
detail Integer
eventPhase Integer
事件处理程序的阶段:1表示捕获阶段,2表示处于目标,3表示冒泡阶段
preventDefault() Function
取消事件的默认行为
stopImmediatePropagation() Function 取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用
stopPropagation() Function
取消事件的进一步冒泡或捕获。
target Element
事件的目标
type String 触发事件的类型
在事件处理程序的内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。
只有在事件处理程序执行期间,event对象才会存在;一旦事件处理程序执行完成,event对象就会被销毁
----------
IE事件对象属性与DOM的对比
IE DOM
cancelBubble stopPropagation()
returnValue preventDefault()
srcElement target
注:cancelBubble只能取消事件冒泡,而stopPropagation()可以取消冒泡和捕获
----------
跨浏览器的事件对象:
EventUtil = { addEvent : function(elem,type,handler){ if(elem.addEventListener){ elem.addEventListener(type,handler,false); }else if(elem.attachEvent){ elem.attachEvent("on"+type,handler); }else{ elem["on"+type] = handler; } }, removeEvent :function(elem,type,handler) { if (elem.removeEventListener) { elem.removeEventListener(type, handler, false); } else if (elem.attachEvent) { elem.detachEvent("on" + type, handler); } else { elem["on" + type] = null; } }, getEvent : function(event){ return event? event : window.event; }, getTarget : function(event){ return event.target ? event.target : window.event.srcElement; }, preventDefault : function(event){ if(event.preventDefault){ event.preventDefault(); }else{ event.returnValue = false; } return false; }, stopPropagation : function(event){ if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble = true; } }, getRelatedTarget : function(event){ if(event.relatedTarget){ return event.relatedTarget; }else if(event.toElement){ return event.toElement; }else if(event.fromElement){ return event.fromElement; }else{ return null; } }, getCharCode : function(event){ if(typeof event.charCode == "number"){ return event.charCode; }else{ return evnet.keyCode; } } }
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子