您的位置:首页 > Web前端 > JavaScript

javascript事件模型框架

2017-05-25 14:32 483 查看

原文链接

最近一直在读《javascript高级程序设计》,也快读完了,读到事件这一章,书中提供的一个事件工具类很实用,我注释了一下,并摘记:


//eventutil.js


var EventUtil = new Object;


/* 


  此方法用来给特定对象添加事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,    fnHandler是事件回调函数


/*


EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {


    //firefox情况下


    if (oTarget.addEventListener) {


        oTarget.addEventListener(sEventType, fnHandler, false);


    }


    //IE下


    else if (oTarget.attachEvent) {


        oTarget.attachEvent("on" + sEventType, fnHandler);


    }


    else {


        oTarget["on" + sEventType] = fnHandler;


    }


};


/* 


  此方法用来移除特定对象的特定事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,fnHandler是事件回调函数


/*       


EventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {


    if (oTarget.removeEventListener) {


        oTarget.removeEventListener(sEventType, fnHandler, false);


    } else if (oTarget.detachEvent) {


        oTarget.detachEvent("on" + sEventType, fnHandler);


    } else { 


        oTarget["on" + sEventType] = null;


    }


};




/*


 格式化事件,因为IE和其他浏览器下获取事件的方式不同并且事件的属性也不尽相同,通过此方法提供一个一致的事件


*/


EventUtil.formatEvent = function (oEvent) {


    //isIE和isWin引用到一个js文件,判断浏览器和操作系统类型


    if (isIE && isWin) {


        oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;


        //IE只支持冒泡,不支持捕获


        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;


        };




         //将toElement,fromElement转化为标准的relatedTarget 


        if (oEvent.type == "mouseout") {


            oEvent.relatedTarget = oEvent.toElement;


        } else if (oEvent.type == "mouseover") {


            oEvent.relatedTarget = oEvent.fromElement;


        }


        //取消冒泡      


        oEvent.stopPropagation = function () {


            this.cancelBubble = true;


        };




        oEvent.target = oEvent.srcElement;


        //添加事件发生时间属性,IE没有


        oEvent.time = (new Date).getTime();


    }


    return oEvent;


};




EventUtil.getEvent = function() {


    if (window.event) {


        //格式化IE的事件


        return this.formatEvent(window.event);


    } else {


        return EventUtil.getEvent.caller.arguments[0];


    }


};



附带上一个判断浏览器和系统类型的js文件,通过引入一些名字显而易见的全局变量作为判断的结果,使用时需要小心变量名称冲突:


//detect.js,同样来自《JAVASCRIPT高级程序设计》


var sUserAgent = navigator.userAgent;


var fAppVersion = parseFloat(navigator.appVersion);




function compareVersions(sVersion1, sVersion2) {




    var aVersion1 = sVersion1.split(".");


    var aVersion2 = sVersion2.split(".");


    


    if (aVersion1.length > aVersion2.length) {


        for (var i=0; i < aVersion1.length - aVersion2.length; i++) {


            aVersion2.push("0");


        }


    } else if (aVersion1.length < aVersion2.length) {


        for (var i=0; i < aVersion2.length - aVersion1.length; i++) {


            aVersion1.push("0");


        }    


    }


    


    for (var i=0; i < aVersion1.length; i++) {


 


        if (aVersion1[i] < aVersion2[i]) {


            return -1;


        } else if (aVersion1[i] > aVersion2[i]) {


            return 1;


        }    


    }


    


    return 0;




}




var isOpera = sUserAgent.indexOf("Opera") > -1;


var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;




if (isOpera) {


    var fOperaVersion;


    if(navigator.appName == "Opera") {


        fOperaVersion = fAppVersion;


    } else {


        var reOperaVersion = new RegExp("Opera (//d+//.//d+)");


        reOperaVersion.test(sUserAgent);


        fOperaVersion = parseFloat(RegExp["$1"]);


    }




    isMinOpera4 = fOperaVersion >= 4;


    isMinOpera5 = fOperaVersion >= 5;


    isMinOpera6 = fOperaVersion >= 6;


    isMinOpera7 = fOperaVersion >= 7;


    isMinOpera7_5 = fOperaVersion >= 7.5;


}




var isKHTML = sUserAgent.indexOf("KHTML") > -1 


              || sUserAgent.indexOf("Konqueror") > -1 


              || sUserAgent.indexOf("AppleWebKit") > -1; 


              


var isMinSafari1 = isMinSafari1_2 = false;


var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;




if (isKHTML) {


    isSafari = sUserAgent.indexOf("AppleWebKit") > -1;


    isKonq = sUserAgent.indexOf("Konqueror") > -1;




    if (isSafari) {


        var reAppleWebKit = new RegExp("AppleWebKit///(//d+(?://.//d*)?)");


        reAppleWebKit.test(sUserAgent);


        var fAppleWebKitVersion = parseFloat(RegExp["$1"]);




        isMinSafari1 = fAppleWebKitVersion >= 85;


        isMinSafari1_2 = fAppleWebKitVersion >= 124;


    } else if (isKonq) {




        var reKonq = new RegExp("Konqueror///(//d+(?://.//d+(?://.//d)?)?)");


        reKonq.test(sUserAgent);


        isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;


        isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;


        isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;


        isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;


    } 


    


}




var isIE = sUserAgent.indexOf("compatible") > -1 


           && sUserAgent.indexOf("MSIE") > -1


           && !isOpera;


           


var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;




if (isIE) {


    var reIE = new RegExp("MSIE (//d+//.//d+);");


    reIE.test(sUserAgent);


    var fIEVersion = parseFloat(RegExp["$1"]);




    isMinIE4 = fIEVersion >= 4;


    isMinIE5 = fIEVersion >= 5;


    isMinIE5_5 = fIEVersion >= 5.5;


    isMinIE6 = fIEVersion >= 6.0;


}




var isMoz = sUserAgent.indexOf("Gecko") > -1


            && !isKHTML;




var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;




if (isMoz) {


    var reMoz = new RegExp("rv:(//d+//.//d+(?://.//d+)?)");


    reMoz.test(sUserAgent);


    isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;


    isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;


    isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;


}




var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 


            && (sUserAgent.indexOf("Mozilla") == 0) 


            && (navigator.appName == "Netscape") 


            && (fAppVersion >= 4.0 && fAppVersion < 5.0);




var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;




if (isNS4) {


    isMinNS4 = true;


    isMinNS4_5 = fAppVersion >= 4.5;


    isMinNS4_7 = fAppVersion >= 4.7;


    isMinNS4_8 = fAppVersion >= 4.8;


}




var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");


var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") 


            || (navigator.platform == "Macintosh");




var isUnix = (navigator.platform == "X11") && !isWin && !isMac;




var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;


var isMac68K = isMacPPC = false;


var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;




if (isWin) {


    isWin95 = sUserAgent.indexOf("Win95") > -1 


              || sUserAgent.indexOf("Windows 95") > -1;


    isWin98 = sUserAgent.indexOf("Win98") > -1 


              || sUserAgent.indexOf("Windows 98") > -1;


    isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 


              || sUserAgent.indexOf("Windows ME") > -1;


    isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 


              || sUserAgent.indexOf("Windows 2000") > -1;


    isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 


              || sUserAgent.indexOf("Windows XP") > -1;


    isWinNT4 = sUserAgent.indexOf("WinNT") > -1 


              || sUserAgent.indexOf("Windows NT") > -1 


              || sUserAgent.indexOf("WinNT4.0") > -1 


              || sUserAgent.indexOf("Windows NT 4.0") > -1 


              && (!isWinME && !isWin2K && !isWinXP);







if (isMac) {


    isMac68K = sUserAgent.indexOf("Mac_68000") > -1 


               || sUserAgent.indexOf("68K") > -1;


    isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 


               || sUserAgent.indexOf("PPC") > -1;  


}




if (isUnix) {


    isSunOS = sUserAgent.indexOf("SunOS") > -1;




    if (isSunOS) {


        var reSunOS = new RegExp("SunOS (//d+//.//d+(?://.//d+)?)");


        reSunOS.test(sUserAgent);


        isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;


        isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;


        isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;


    }


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息