一、DOM事件级别
DOM级别一共有四个级别:DOM0级、DOM1级、DOM2级和DOM3级。因为DOM 1级中没有事件的相关内容,所以没有DOM 1级事件。
例子:
- 0级DOM
document.getElementById("myButton").onclick = function () {alert('thanks');}
为同一个元素/标签绑定多个同类型事件的时候,是不被允许的,DOM0事件绑定,给元素的事件行为绑定方法,这些方法都是在当前元素事件行为的冒泡阶段(或者目标阶段)执行的。
- 2级DOM
p.addEventListener("click",function(){ console.log(arguments[0]); })
el.addEventListener(event-name, callback, boolean)event-name: 事件名称,可以是标准的DOM事件callback: 回调函数,当事件触发时,函数会被注入一个参数为当前的事件对象 eventboolean: 默认是false,代表事件句柄在冒泡阶段执行
- 3级DOM,在DOM 2级事件的基础上添加了更多的事件类型。
3级DOM------------------------------------------------------------------UI事件,当用户与页面上的元素交互时触发,如:load、scroll焦点事件,当元素获得或失去焦点时触发,如:blur、focus鼠标事件,当用户通过鼠标在页面执行操作时触发如:dblclick、mouseup滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel文本事件,当在文档中输入文本时触发,如:textInput键盘事件,当用户通过键盘在页面上执行操作时触发,如:keydown、keypress合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart变动事件,当底层DOM结构发生变化时触发,如:DOMsubtreeModified同时DOM3级事件也允许使用者自定义一些事件。
二、DOM事件模型
DOM事件模型有两个:事件捕获和事件冒泡
- 捕获
- 从外向内找监听函数,叫做事件捕获
- 冒泡
- 从内到外找监听函数,叫做事件冒泡
DOM的事件机制(事件流)
一个事件发生后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段。
(1)捕获阶段:事件从window对象自上而下向目标节点传播的阶段;
(2)目标阶段:真正的目标节点正在处理事件的阶段;
(3)冒泡阶段:事件从目标节点自下而上向window对象传播的阶段。
target 对比 currentTarget
e.target用户操作的元素e.currentTarget程序员监听的元素、this是e.currentTarget
例子div > span {文字}, 用户行为:点击文字 (监听事件绑定在div元素上)--------------------------------------------------------------------e.target 就是spane.currentTarget 就是div
取消冒泡
捕获不可取消,但是冒泡可以取消
e.stopPropagation()可以中断浏览器不再往上走。
事件对象event下的属性和方法
因为各个浏览器的事件对象不一样, 把主要的事件对象的属性和方法列出来;
bubble : 表明事件是否冒泡cancelable : 表明是否可以取消冒泡currentTarget : 当前事件程序正在处理的元素, 和this一样的;defaultPrevented: false ,如果调用了preventDefualt这个就为真了;detail: 与事件有关的信息(滚动事件等等)eventPhase: 值为1表示处于捕获阶段, 值为2表示处于目标阶段,值为3表示在冒泡阶段target || srcElement: 事件的目标trusted: 为ture是浏览器生成的,为false是开发人员创建的(DOM3)type : 事件的类型 view : 与元素关联的window, 我们可能跨iframe;preventDefault() 取消默认事件;stopPropagation() 取消冒泡或者捕获;stopImmediatePropagation() (DOM3)阻止任何事件的运行; stopImmediatePropagation阻止绑定在事件触发元素的 其他同类事件的callback的运行 IE下的事件对象是在window下的,而标准应该作为一个参数, 传为函数第一个参数; IE的事件对象定义的属性跟标准的不同,如: cancelBubble 默认为false, 如果为true就是取消事件冒泡; returnValue 默认是true,如果为false就取消默认事件; srcElement, 这个指的是target, Firefox下的也是srcElement;
