《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/,如需转载请自行联系原作者

相关文章
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
337 0
|
8月前
|
JavaScript 前端开发 Java
【Java进阶】详解JavaScript事件
总的来说,JavaScript事件是JavaScript交互设计的核心,理解和掌握JavaScript事件对于编写高效、响应式的网页应用至关重要。
153 15
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
157 3
|
11月前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
396 3
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
444 5
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
208 6
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
|
JavaScript API
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
深入解析JS中的visibilitychange事件:监听浏览器标签间切换的利器
730 0
|
JavaScript
js两种移除事件的方法
js两种移除事件的方法
145 0
|
JavaScript 前端开发 Android开发
JavaScript触摸touch事件
JavaScript触摸touch事件