javascript 事件模型 及 event对象属性总结

    W3c 事件模型也就是标准事件模型,执行顺序分为3个阶段,捕获阶段,目标阶段,冒泡阶段。
        捕获阶段:指由document节点向子节点逐级传播,只要某个子节点注册了相同类型的事件,就会执行绑定的事件函数,直到目标节点停止;
        目标阶段:执行目标节点上绑定的事件处理函数;
        冒泡阶段:跟捕获阶段相反,会由目标节点向父节点逐级冒泡,只要某个父节点注册了相同类型的事件,就会执行绑定的事件函数,直到document节点停止;

    IE下没有 捕获阶段;

   W3C注册事件的方法是 addEventListener ,它需要传入三个参数 eventType(事件类型 string)、handler(事件函数 function)、useCapture(是否捕获 boolean)。前两个常用都明白,只介绍下第三个参数,useCapture值为true时,事件处理函数会在捕获模式下触发执行;设为false时,事件处理函数会在冒泡模式下触发执行;所以为了跟IE统一,一般都是设为false,使用冒泡模式触发;

 对此我们以实例求证:

<div id="div1">
    1
    <div id="div2">
        2
        <div id="div3">
            3
        </div>
    </div>
</div>
var d1 = document.getElementById("div1");
var d2 = document.getElementById("div2");
var d3 = document.getElementById("div3");
document.addEventListener("click",function(){alert(this.nodeName)},true);
document.addEventListener("click",function(){alert(this.nodeName)},false);
d1.addEventListener("click",function(){alert(this.id)},true);
d1.addEventListener("click",function(){alert(this.id)},false);
d2.addEventListener("click",function(){alert(this.id)},true);
d2.addEventListener("click",function(){alert(this.id)},false);
d3.addEventListener("click",function(){alert(this.id)},true);
d3.addEventListener("click",function(){alert(this.id)},false);

   点击div3,他的弹出信息依次是:#document,div1,div2,div3,div3,div2,div1,#document。

   IE注册事件的方法是 attachEvent,需要传入两个参数,eventType(事件类型 string,注:需要前面+"on"),handler(事件函数 function);

 为了兼容所有浏览器方便使用,我们一般都会对其进行封装,示例:

var Events=(function(){
    var addListener,removeListener,fire;
    if(typeof window.addEventListener === "function"){
        addListener=function(el,type,handler){
            el.addEventListener(type,handler,false);    
        };
        removeListener=function(el,type,handler){
            el.removeEventListener(type,handler,false);
        };
        fire=function(el,type){
            el[type]();
        };
    }else if(typeof document.attachEvent === "function"){
        addListener=function(el,type,handler){
            el.attachEvent("on"+type,handler);    
        };
        removeListener=function(el,type,handler){
            el.detachEvent("on"+type,handler);
        };    
        fire=function(el,type){
            el[type]();
        };
    }else{
        addListener=function(el,type,handler){
            el["on"+type]=handler;
        };
        removeListener=function(el,type,handler){
            el["on"+type]=null;
        };
        fire=function(el,type){
            el[type]();
        };
    }
    return {
        addListener:addListener,
        removeListener:removeListener,
        fire:fire
    }
 })();
//调用:
 Events.addListener(document,"click",function(event){
    event = event||window.event;
    alert(typeof event.srcElement);
 });
 Events.fire(document.getElementById("js_name"),"click");

 删除事件 W3C用 removeEventListener(eventType,handler,useCapture);IE用detachEvent(eventType,handler);不再举例;

 event 对象:

获取对象一般用var event = window.event | evt;//evt传进来的evt;

IE事件属性 W3C事件属性 介绍
altKey altKey 设置或获取 Alt 键的状态,当前状态的值 true (按下) 或 false (没按下)
ctrlKey ctrlKey 设置或获取 Ctrl 键的状态,当前状态的值 true (按下) 或 false (没按下)
shiftKey shiftKey 设置或获取 Shift 键的状态,当前状态的值 true (按下) 或 false (没按下)
 clientX  clientX  设置或获取鼠标指针相对于用户浏览器客户区域左边缘 X 轴距离 (不包括浏览器操作控件和滚动条)
 clientY  clientY  设置或获取鼠标指针相对于用户浏览器客户区域上边缘 Y 轴距离(不包括浏览器操作控件和滚动条)
screenX  screenX   设置或获取鼠标指针相对于屏幕左边缘在 X 轴上距离
 screenY screenY   设置或获取鼠标指针相对于屏幕上边缘在 Y 轴上距离
 offsetX layerX   设置或获取鼠标指针相对于触发对象在 X 轴上偏移量
offsetY   layerY  设置或获取鼠标指针相对于触发对象在 Y 轴上偏移量
 x  pageX  设置或获取鼠标指针相对于一个相对定位父元素的左边缘 X 轴上的距离
 y  pageY  设置或获取鼠标指针相对于一个相对定位父元素的上边缘 Y 轴上的距离
 cancelBubble  stopPropagation()  设置或获取当前事件是否要在事件处理函数中向上冒泡,true (允许) false(不允许)
 returnValue preventDefault()   设置或获取事件的返回值,true (事件中的值被返回) false(源对象上的默认操作被取消)
 fromElement  relatedTarget  设置或获取事件发生时激活的对象或鼠标将要离开的对象
srcElement   target  设置或获取出发事件的对象,也就是发生事件的文档元素
 keyCode keyCode   设置或获取与触发事件的按键相关联的按键代码(Unicode),改属性与keydown,keypress,keyup配合使用,默认则为0,String.fromCharCode(event.keyCode)转换编码为字符串
type type 从event中获取事件名称,如:click,mouseover..




posted @ 2013-07-16 17:45  北京-木木  阅读(375)  评论(0编辑  收藏  举报