DOM 事件?
?
?? ?就是浏览器检测到某种操作并执行相应事件的过程。
?
事件类型:?
?
?? ?1. 对象事件 ?
?? ? ? ? ? load和unload ?
?? ? ? ? ? ? ? ? ? ?a) ?适用于javascript对象和dom对象
?? ? ? ? ? ? ? ? ? ?b) ?load的涵义 : ? ? ? 页面或者图片载入成功 ?
?? ? ? ? ? ? ? ? ? ?c) ?window.onload ? 缺陷必须等在页面所有元素加载完成才能执行,如果包含很多图片执行脚本时就会有明显的停顿。使用css引入则不会有这个问题。
?? ? ? ? ? error ?
?? ? ? ? ? ? ? ? ? ?a) ?图片载入失败会执行的函数
?? ? ? ? ? ? ? ? ? ?b) ?和load事件配合使用监听图片载入
?
?? ? ? ? ?示例代码:
var img = document.createElement("img"); addEvent(img,load,function(){alert("ok")}); addEvent(img,error,function(){alert("error")}); img.setAttribute("src",......);?
?
?? ?2. ?鼠标事件
?? ? ? ? ? ?a) ?mousemove ? 鼠标移动时会一直触发 ?
?? ? ? ? ? ?b) ?mouseover 和 ?mouseout?
?? ? ? ?html结构
<div id="first"> <div id="second"></div> </div>
?? ? ? 对于这种结构如果都注册了mouseover和mouseout事件就会发生问题, 如果鼠标从first移动到second就会触发first的mouseout事件但实际second还是在first中的。
?
?? ? ? ? ? ? c) ??mousedown ? 鼠标单击是也会触发move
?? ? ? ? ? ? d) ? 如果在mousedown和mouseup事件之间移动了鼠标则不会触发click事件。
?
?? 3. 键盘事件
?
?? ? ? ? ? ? 只是用于document ??
?
?? 4. 表单事件
?
?? ? ? ? ? ? a) ? submit 和 reset
?? ? ? ? ? ? b) ? blur ?和 focus
?? ? ? ? ? ? c) ? ?change ?适用于 select ?input ?textarea等
?
?? 5. DOM事件 ?
?
?? ? ? ? ? ? ie不支持
?
事件流和事件监听器
?
?? ? 两个阶段:冒泡阶段和捕获阶段
?
?? ? 三种模型
?
?? ? ? ? ? ? ?IE浏览器: 采用的事件流是冒泡阶段
?
?? ? ? ? ? ? ?Netscape: 采用的是捕获阶段
?
?? ? ? ? ? ? ?W3C标准: 为了屏蔽差异将两个阶段结合起来 先执行捕获阶段,在执行冒泡阶段。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用户在事件注册时可以 ?通过false选择捕获阶段
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?通过true选择冒泡阶段
?
?? ? 阻止默认事件:
?? ? ? ? ?javascript代码
if(event.preventDefault){ event.preventDefault(); }else{ event.returnValue = false; }
?
?? ? 阻止事件冒泡:
?? ? ? ??javascript代码
if(event.stopPropagation){ event.stopPropagation(); //W3C标准 }else{ event.cancelBubble = true; //IE浏览器 }
?
?? ?事件注册:
?
?? ? ? ? ? ?a) ?嵌入的事件注册 ?为标签的属性指定一个函数值
?? ? ? ? ? ? ? ? ? ?例如:
<div onclick="test()">test</div>
?? ? ? ? ? ? ? ? ? ? 好处: 所有的浏览器都支持这种事件注册的方法。
?
?? ? ? ? ? ? ? ? ? ? 缺点: ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1. ?不符合W3C的标记与行为分开的准则
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2. ?不能注册多个方法
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3. ?如果要为多个标签注册相同事件 ?会有大量重复代码
?
?? ? ? ? ? b) ? 传统的事件模型 ? 为DOM节点的属性添加一个方法
?? ? ? ? ? ?例如
var div = document.getElementById("test"); div.onclick = function(){} //注册事件 div.onclick = null //注销事件
?? ? ? ? ? ? ? ? ? ? ? ? ?好处: ? ?比起之前的嵌入式注册 将标记和行为进行了分离。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 也是不针对特定的浏览器
?
?? ? ? ? ? ? ? ? ? ? ? ? ?缺点: ? ? 如果监听器多了 代码会比较混乱 不容易维护
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?没办法指定事件流顺序
?
?? ? ? ? ? c) ? 后来ie提出了一种事件注册的机制
?? ? ? ? ? ? ? ? ?示例代码
element.attachEvent("type",listener);//注册事件 element.detachEvent("type",listener);//注销事件
?
?? ? ? ? ? ? ? ? ? ? ? ? ?好处 : ?思路清晰 ?可以绑定多个事件
?
?? ? ? ? ? ? ? ? ? ? ? ? ?缺点: ? 这种模型只在ie浏览器下可以使用
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?于标准相比 ie中的listener只是一个引用this指针还是指向定义的环境 大多数是window对象
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不支持捕获模型
?
?? ? ? ? ? ?d) ?W3C DOM事件模型
?? ? ? ? ? ? ? ? ?示例代码
element.addEventListener("type",listener,boolean); //注册事件 element.removeEventListener("type",listener,boolean); //注销事件
?
?
?? ? ? ? ? ?e) ? 多种模型下的手工模拟事件
?? ? ? ? ? ? ? ? ? ??示例代码
element.onclick() //传统事件中 可以通过直接调用这个方法模拟click 但是没有event对象 element.fireEvent("onclick"); // ie浏览器中 这种方法有event对象 var event = document.createEvent("MouseEvent"); //W3C的的事件模拟 event.initMouseEvent(.......); //具体参数请查阅W3C可以通过event.data设置event的值
element.dirpatchEvent(event);
?
? 事件绑定:
?
? ? ? ? ? W3C中:
addEventListener
? ? ? ? ?IE中:
? ? ? ? ? ? ? ?attachEvent
? ? ? ? ? 二者的不同之处在于对于事件句柄的处理,W3C中事件句柄的执行环境就是绑定的对象,而Ie中执行环境则是window。换句话说,函数中得this指向不同,W3C中指向node,ie中执行window。
?
? ?? 因此需要在ie中进行一个事件转换。
?
?
??访问事件对象
?
?? ? ? ? 每次发生一个事件时都会有一个事件对象,在W3C 事件模型中事件监听器取得一个表示事件本身的对象参数而在ie中则会将事件放入window.event属性中。
?
?? ? ? ? ?W3C事件的属性:
?? ? ? ? ? ? ? ? ? ?currentTarget ?表示当前事件目标
?? ? ? ? ? ? ? ? ? ?target ? ? ? ? ? ? ?最早调用事件的目标
?? ? ? ? ? ? ? ? ? ?type ? ? ? ? ? ? ??
?? ? ? ? ?MouseEvent ? ?
?? ? ? ? ? ? ? ? ? ?button属性 ? ? ? ?
?? ? ? ? ? ? ? ? ? ?获取鼠标位置
?? ? ? ? ? ? ? ? ? ? ? ? ? ?clientY 指的是鼠标相对浏览器顶端的距离
?? ? ? ? ? ? ? ? ? ? ? ? ? ?pageY 只能在safari中使用 鼠标相对于文档顶端的距离
?