《JavaScript高级程序设计》阅读笔记(十八):跨平台的事件

简介:

跨平台的事件EventUtil对象

  EventUtil:

var EventUtil={
    addEventHandler:function(oTarget, sEventType, fnHandler){
        if(oTarget.addEventListener){
            oTarget.addEventListener(sEventType,fnHandler,false);
        } else if(oTarget.attachEvent){
            oTarget.attachEvent("on"+sEventType,fnHandler);
        } else{
            oTarget["on"+sEventType]=fnHandler;
        }
    },
    removeEventHandler:function(oTarget, sEventType, fnHandler){
        if(oTarget.removeEventListener){
            oTarget.removeEventListener(sEventType,fnHandler);
        } else if(oTarget.detachEvent){
            oTarget.detachEvent("on"+sEventType,fnHandler);
        } else{
            oTarget["on"+sEventType]=null;
        }
    },
    formatEvent:function(oEvent){
        var isIE=/msie/i.test(navigator.userAgent),
            isWin=/win/i.test(navigator.userAgent);
        if(isIE && isWin){
            oEvent.charCode=(oEvent.type == "keypress")?oEvent.keyCode:0;
            oEvent.eventPhase =2;
            oEvent.isChar=(oEvent.charCode>0);
            oEvent.pageX=oEvent.clientX+document.body.scrollLeft;
            oEvent.pageY=oEvent.clientY+document.body.scrollTop;
            oEvent.preventDefault=function(){
                this.returnvalue=false;
            }
            if(oEvent.type == "mouseout"){
                oEvent.relateTarget=oEvent.toElement;
            }else if(oEvent.type=="mouseover"){
                oEvent.relatedTarget=oEvent.fromElement;
            }
            oEvent.stopPropagation=function(){
                this.cancelBubble=true;
            }
            oEvent.target=oEvent.srcElement;
            oEvent.time=(new Date()).getTime();
        }
        return oEvent;
    },
    getEvent:function(){
        if(window.event){
            return this.formatEvent(window.event);
        }else{
            return EventUtil.getEvent.caller.arguments[0];
        }
    }
}

测试

<!DOCTYPE html>
<html>
<head>
    <title>Demo</title>
    <meta charset="utf-8"/>
    <script>
        var EventUtil={
            addEventHandler:function(oTarget, sEventType, fnHandler){
                if(oTarget.addEventListener){
                    oTarget.addEventListener(sEventType,fnHandler,false);
                } else if(oTarget.attachEvent){
                    oTarget.attachEvent("on"+sEventType,fnHandler);
                } else{
                    oTarget["on"+sEventType]=fnHandler;
                }
            },
            removeEventHandler:function(oTarget, sEventType, fnHandler){
                if(oTarget.removeEventListener){
                    oTarget.removeEventListener(sEventType,fnHandler);
                } else if(oTarget.detachEvent){
                    oTarget.detachEvent("on"+sEventType,fnHandler);
                } else{
                    oTarget["on"+sEventType]=null;
                }
            },
            formatEvent:function(oEvent){
                var isIE=/msie/i.test(navigator.userAgent),
                    isWin=/win/i.test(navigator.userAgent);
                if(isIE && isWin){
                    oEvent.charCode=(oEvent.type == "keypress")?oEvent.keyCode:0;
                    oEvent.eventPhase =2;
                    oEvent.isChar=(oEvent.charCode>0);
                    oEvent.pageX=oEvent.clientX+document.body.scrollLeft;
                    oEvent.pageY=oEvent.clientY+document.body.scrollTop;
                    oEvent.preventDefault=function(){
                        this.returnvalue=false;
                    }
                    if(oEvent.type == "mouseout"){
                        oEvent.relateTarget=oEvent.toElement;
                    }else if(oEvent.type=="mouseover"){
                        oEvent.relatedTarget=oEvent.fromElement;
                    }
                    oEvent.stopPropagation=function(){
                        this.cancelBubble=true;
                    }
                    oEvent.target=oEvent.srcElement;
                    oEvent.time=(new Date()).getTime();
                }
                return oEvent;
            },
            getEvent:function(){
                if(window.event){
                    return this.formatEvent(window.event);
                }else{
                    return EventUtil.getEvent.caller.arguments[0];
                }
            }
        }


        EventUtil.addEventHandler(window,"load",function(){
            var oDiv=document.getElementById("div1");

            EventUtil.addEventHandler(oDiv,"mouseover",handleEvent);
            EventUtil.addEventHandler(oDiv,"mouseout",handleEvent);
            EventUtil.addEventHandler(oDiv,"mousedown",handleEvent);
            EventUtil.addEventHandler(oDiv,"mouseup",handleEvent);
            EventUtil.addEventHandler(oDiv,"click",handleEvent);
            EventUtil.addEventHandler(oDiv,"dblclick",handleEvent);
        });

        function handleEvent(){
            var oEvent=EventUtil.getEvent();
            var oTextbox=document.getElementById("txt1");
            oTextbox.value+="\n>"+oEvent.type;
            oTextbox.value+="\n    target is "+oEvent.target.tagName;
            if(oEvent.relatedTarget){
                oTextbox.value+="\n    relateTarget is "+oEvent.relatedTarget.tagName;
            }
        }
    </script>
</head>
<body>
    <p>Use your mouse to click and double click the red square.</p>
    <div id="div1" style="width:100px;height:100px;background:red;">Test</div>
    <p><textarea id="txt1" rows="15" cols="50"></textarea></p>
</body>
</html>

Use your mouse to click and double click the red square.

Test
 

本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

相关文章
|
21天前
|
JavaScript 前端开发
js开发:请解释事件冒泡和事件捕获。
JavaScript中的事件处理有冒泡和捕获两种方式。事件冒泡是从子元素向上级元素传递,而事件捕获则从外层元素向内层传递。`addEventListener`的第三个参数可设定事件模式,`false`或不设为冒泡,`true`为捕获。示例代码展示了如何设置。
24 2
|
8天前
|
JavaScript 前端开发 开发者
javascript事件大全
javascript事件大全
10 1
|
8天前
|
JavaScript 前端开发
Javascript的一些监听事件
Javascript的一些监听事件
11 2
|
8天前
|
JavaScript 前端开发
js的事件介绍
js的事件介绍
11 1
|
8天前
|
JavaScript 前端开发
js的事件
js的事件
11 1
|
8天前
|
JavaScript 前端开发
js的交互事件
js的交互事件
13 1
|
12天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
14天前
|
JavaScript 前端开发 开发者
【JavaScript技术专栏】JavaScript事件处理机制详解
【4月更文挑战第30天】本文探讨JavaScript中的事件处理机制,涉及事件类型(如click、mouseover)、事件流(冒泡型、捕获型及目标阶段)、事件处理函数(内联与addEventListener方法)以及事件委托(用于优化内存和处理动态元素)。此外,还介绍了事件取消,通过`preventDefault()`和`stopPropagation()`控制事件行为。理解这些概念对构建交互式Web应用至关重要。
|
15天前
|
JavaScript 前端开发
11.JavaScript 事件的概念以及绑定方法
11.JavaScript 事件的概念以及绑定方法
|
19天前
|
JavaScript
js_操作dom(委托和冒泡事件)
js_操作dom(委托和冒泡事件)
16 0