【笔记】JS事件模型再复习之笔记
来源:互联网 发布:java c base64 通用 编辑:程序博客网 时间:2024/06/06 09:23
写在前面:这已经是第四次翻红宝书复习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; } } }
0 0
- 【笔记】JS事件模型再复习之笔记
- js学习笔记之事件处理模型
- js复习笔记
- js复习笔记day1
- js复习笔记day2
- js复习笔记day3
- js复习笔记day4
- js复习笔记day5
- js复习笔记day6
- js复习笔记day7
- js复习笔记day8
- 复习笔记之三--内核对象线程同步---事件
- Node.js学习笔记之三:事件
- [JS]笔记14之事件委托
- js学习笔记之事件1
- js复习笔记(忘记tbodies)
- JS学习笔记9之event事件及其他事件
- 笔记:js常用事件
- 天主教、新教、东正教
- Codeforces Round #363 (Div. 1) C LRU
- Java 深入理解与感悟
- HTTP与HTTPS的区别
- HDU2222 Keywords Search [AC自动机]
- 【笔记】JS事件模型再复习之笔记
- 阅读Logback文档笔记--Logback的Layout配置
- 网络基础篇——socket编程之TCP服务器
- 暑假集训第1天链表-数据结构实验之链表七:单链表中重复元素的删除
- TCP/TP协议备忘录
- 如何在html中下载pdf等文件而不是直接打开
- MySQL utf8mb4 字符集,用于存储emoji表情
- 关于Bot系统的一篇总结性文章(也说bot--一篇survey)
- UE4技巧