javascript事件模型框架

简介: 最近一直在读《javascript高级程序设计》,也快读完了,读到事件这一章,书中提供的一个事件工具类很实用,我注释了一下,并摘记: //eventutil.jsvar EventUtil = new Object;/**//*   此方法用来给特定对象添加事件,oTarget是指定对象,sEve
最近一直在读《javascript高级程序设计》,也快读完了,读到事件这一章,书中提供的一个事件工具类很实用,我注释了一下,并摘记:

None.gif // eventutil.js
None.gif
var  EventUtil  =   new  Object;
ExpandedBlockStart.gifContractedBlock.gif
/**/ /* 
InBlock.gif  此方法用来给特定对象添加事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,    fnHandler是事件回调函数
InBlock.gif/*
InBlock.gifEventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {
InBlock.gif    //firefox情况下
InBlock.gif    if (oTarget.addEventListener) {
InBlock.gif        oTarget.addEventListener(sEventType, fnHandler, false);
InBlock.gif    }
InBlock.gif    //IE下
InBlock.gif    else if (oTarget.attachEvent) {
InBlock.gif        oTarget.attachEvent("on" + sEventType, fnHandler);
InBlock.gif    }
InBlock.gif    else {
InBlock.gif        oTarget["on" + sEventType] = fnHandler;
InBlock.gif    }
InBlock.gif};
InBlock.gif/* 
InBlock.gif  此方法用来移除特定对象的特定事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,fnHandler是事件回调函数
InBlock.gif/*       
InBlock.gifEventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
InBlock.gif    if (oTarget.removeEventListener) {
InBlock.gif        oTarget.removeEventListener(sEventType, fnHandler, false);
InBlock.gif    } else if (oTarget.detachEvent) {
InBlock.gif        oTarget.detachEvent("on" + sEventType, fnHandler);
InBlock.gif    } else { 
InBlock.gif        oTarget["on" + sEventType] = null;
InBlock.gif    }
InBlock.gif};
InBlock.gif
InBlock.gif/*
InBlock.gif 格式化事件,因为IE和其他浏览器下获取事件的方式不同并且事件的属性也不尽相同,通过此方法提供一个一致的事件
ExpandedBlockEnd.gif
*/

ExpandedBlockStart.gifContractedBlock.gifEventUtil.formatEvent 
=   function  (oEvent)  dot.gif {
InBlock.gif    
//isIE和isWin引用到一个js文件,判断浏览器和操作系统类型
ExpandedSubBlockStart.gifContractedSubBlock.gif
    if (isIE && isWin) dot.gif{
InBlock.gif        oEvent.charCode 
= (oEvent.type == "keypress"? oEvent.keyCode : 0;
InBlock.gif        
//IE只支持冒泡,不支持捕获
InBlock.gif
        oEvent.eventPhase = 2;
InBlock.gif        oEvent.isChar 
= (oEvent.charCode > 0);
InBlock.gif        oEvent.pageX 
= oEvent.clientX + document.body.scrollLeft;
InBlock.gif        oEvent.pageY 
= oEvent.clientY + document.body.scrollTop;
InBlock.gif        
//阻止事件的默认行为
ExpandedSubBlockStart.gifContractedSubBlock.gif
        oEvent.preventDefault = function () dot.gif{
InBlock.gif            
this.returnValue = false;
ExpandedSubBlockEnd.gif        }
;
InBlock.gif
InBlock.gif         
//将toElement,fromElement转化为标准的relatedTarget 
ExpandedSubBlockStart.gifContractedSubBlock.gif
        if (oEvent.type == "mouseout"dot.gif{
InBlock.gif            oEvent.relatedTarget 
= oEvent.toElement;
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else if (oEvent.type == "mouseover"dot.gif{
InBlock.gif            oEvent.relatedTarget 
= oEvent.fromElement;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
//取消冒泡      
ExpandedSubBlockStart.gifContractedSubBlock.gif
        oEvent.stopPropagation = function () dot.gif{
InBlock.gif            
this.cancelBubble = true;
ExpandedSubBlockEnd.gif        }
;
InBlock.gif
InBlock.gif        oEvent.target 
= oEvent.srcElement;
InBlock.gif        
//添加事件发生时间属性,IE没有
InBlock.gif
        oEvent.time = (new Date).getTime();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return oEvent;
ExpandedBlockEnd.gif}
;
None.gif
ExpandedBlockStart.gifContractedBlock.gifEventUtil.getEvent 
=   function ()  dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (window.event) dot.gif{
InBlock.gif        
//格式化IE的事件
InBlock.gif
        return this.formatEvent(window.event);
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else dot.gif{
InBlock.gif        
return EventUtil.getEvent.caller.arguments[0];
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
;
None.gif


附带上一个判断浏览器和系统类型的js文件,通过引入一些名字显而易见的全局变量作为判断的结果,使用时需要小心变量名称冲突:
None.gif // detect.js,同样来自《JAVASCRIPT高级程序设计》
None.gif
var  sUserAgent  =  navigator.userAgent;
None.gif
var  fAppVersion  =  parseFloat(navigator.appVersion);
None.gif
ExpandedBlockStart.gifContractedBlock.gif
function  compareVersions(sVersion1, sVersion2)  dot.gif {
InBlock.gif
InBlock.gif    
var aVersion1 = sVersion1.split(".");
InBlock.gif    
var aVersion2 = sVersion2.split(".");
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (aVersion1.length > aVersion2.length) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i=0; i < aVersion1.length - aVersion2.length; i++dot.gif{
InBlock.gif            aVersion2.push(
"0");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else if (aVersion1.length < aVersion2.length) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i=0; i < aVersion2.length - aVersion1.length; i++dot.gif{
InBlock.gif            aVersion1.push(
"0");
ExpandedSubBlockEnd.gif        }
    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (var i=0; i < aVersion1.length; i++dot.gif{
InBlock.gif 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (aVersion1[i] < aVersion2[i]) dot.gif{
InBlock.gif            
return -1;
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else if (aVersion1[i] > aVersion2[i]) dot.gif{
InBlock.gif            
return 1;
ExpandedSubBlockEnd.gif        }
    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
return 0;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isOpera  =  sUserAgent.indexOf( " Opera " >   - 1 ;
None.gif
var  isMinOpera4  =  isMinOpera5  =  isMinOpera6  =  isMinOpera7  =  isMinOpera7_5  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isOpera)  dot.gif {
InBlock.gif    
var fOperaVersion;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(navigator.appName == "Opera"dot.gif{
InBlock.gif        fOperaVersion 
= fAppVersion;
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else dot.gif{
InBlock.gif        
var reOperaVersion = new RegExp("Opera (//d+//.//d+)");
InBlock.gif        reOperaVersion.test(sUserAgent);
InBlock.gif        fOperaVersion 
= parseFloat(RegExp["$1"]);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    isMinOpera4 
= fOperaVersion >= 4;
InBlock.gif    isMinOpera5 
= fOperaVersion >= 5;
InBlock.gif    isMinOpera6 
= fOperaVersion >= 6;
InBlock.gif    isMinOpera7 
= fOperaVersion >= 7;
InBlock.gif    isMinOpera7_5 
= fOperaVersion >= 7.5;
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isKHTML  =  sUserAgent.indexOf( " KHTML " >   - 1  
None.gif              
||  sUserAgent.indexOf( " Konqueror " >   - 1  
None.gif              
||  sUserAgent.indexOf( " AppleWebKit " >   - 1
None.gif              
None.gif
var  isMinSafari1  =  isMinSafari1_2  =   false ;
None.gif
var  isMinKonq2_2  =  isMinKonq3  =  isMinKonq3_1  =  isMinKonq3_2  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isKHTML)  dot.gif {
InBlock.gif    isSafari 
= sUserAgent.indexOf("AppleWebKit"> -1;
InBlock.gif    isKonq 
= sUserAgent.indexOf("Konqueror"> -1;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (isSafari) dot.gif{
InBlock.gif        
var reAppleWebKit = new RegExp("AppleWebKit///(//d+(?://.//d*)?)");
InBlock.gif        reAppleWebKit.test(sUserAgent);
InBlock.gif        
var fAppleWebKitVersion = parseFloat(RegExp["$1"]);
InBlock.gif
InBlock.gif        isMinSafari1 
= fAppleWebKitVersion >= 85;
InBlock.gif        isMinSafari1_2 
= fAppleWebKitVersion >= 124;
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else if (isKonq) dot.gif{
InBlock.gif
InBlock.gif        
var reKonq = new RegExp("Konqueror///(//d+(?://.//d+(?://.//d)?)?)");
InBlock.gif        reKonq.test(sUserAgent);
InBlock.gif        isMinKonq2_2 
= compareVersions(RegExp["$1"], "2.2">= 0;
InBlock.gif        isMinKonq3 
= compareVersions(RegExp["$1"], "3.0">= 0;
InBlock.gif        isMinKonq3_1 
= compareVersions(RegExp["$1"], "3.1">= 0;
InBlock.gif        isMinKonq3_2 
= compareVersions(RegExp["$1"], "3.2">= 0;
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isIE  =  sUserAgent.indexOf( " compatible " >   - 1  
None.gif           
&&  sUserAgent.indexOf( " MSIE " >   - 1
None.gif           
&&   ! isOpera;
None.gif           
None.gif
var  isMinIE4  =  isMinIE5  =  isMinIE5_5  =  isMinIE6  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isIE)  dot.gif {
InBlock.gif    
var reIE = new RegExp("MSIE (//d+//.//d+);");
InBlock.gif    reIE.test(sUserAgent);
InBlock.gif    
var fIEVersion = parseFloat(RegExp["$1"]);
InBlock.gif
InBlock.gif    isMinIE4 
= fIEVersion >= 4;
InBlock.gif    isMinIE5 
= fIEVersion >= 5;
InBlock.gif    isMinIE5_5 
= fIEVersion >= 5.5;
InBlock.gif    isMinIE6 
= fIEVersion >= 6.0;
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isMoz  =  sUserAgent.indexOf( " Gecko " >   - 1
None.gif            
&&   ! isKHTML;
None.gif
None.gif
var  isMinMoz1  =  sMinMoz1_4  =  isMinMoz1_5  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isMoz)  dot.gif {
InBlock.gif    
var reMoz = new RegExp("rv:(//d+//.//d+(?://.//d+)?)");
InBlock.gif    reMoz.test(sUserAgent);
InBlock.gif    isMinMoz1 
= compareVersions(RegExp["$1"], "1.0">= 0;
InBlock.gif    isMinMoz1_4 
= compareVersions(RegExp["$1"], "1.4">= 0;
InBlock.gif    isMinMoz1_5 
= compareVersions(RegExp["$1"], "1.5">= 0;
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isNS4  =   ! isIE  &&   ! isOpera  &&   ! isMoz  &&   ! isKHTML 
None.gif            
&&  (sUserAgent.indexOf( " Mozilla " ==   0
None.gif            
&&  (navigator.appName  ==   " Netscape "
None.gif            
&&  (fAppVersion  >=   4.0   &&  fAppVersion  <   5.0 );
None.gif
None.gif
var  isMinNS4  =  isMinNS4_5  =  isMinNS4_7  =  isMinNS4_8  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isNS4)  dot.gif {
InBlock.gif    isMinNS4 
= true;
InBlock.gif    isMinNS4_5 
= fAppVersion >= 4.5;
InBlock.gif    isMinNS4_7 
= fAppVersion >= 4.7;
InBlock.gif    isMinNS4_8 
= fAppVersion >= 4.8;
ExpandedBlockEnd.gif}

None.gif
None.gif
var  isWin  =  (navigator.platform  ==   " Win32 " ||  (navigator.platform  ==   " Windows " );
None.gif
var  isMac  =  (navigator.platform  ==   " Mac68K " ||  (navigator.platform  ==   " MacPPC "
None.gif            
||  (navigator.platform  ==   " Macintosh " );
None.gif
None.gif
var  isUnix  =  (navigator.platform  ==   " X11 " &&   ! isWin  &&   ! isMac;
None.gif
None.gif
var  isWin95  =  isWin98  =  isWinNT4  =  isWin2K  =  isWinME  =  isWinXP  =   false ;
None.gif
var  isMac68K  =  isMacPPC  =   false ;
None.gif
var  isSunOS  =  isMinSunOS4  =  isMinSunOS5  =  isMinSunOS5_5  =   false ;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isWin)  dot.gif {
InBlock.gif    isWin95 
= sUserAgent.indexOf("Win95"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 95"> -1;
InBlock.gif    isWin98 
= sUserAgent.indexOf("Win98"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 98"> -1;
InBlock.gif    isWinME 
= sUserAgent.indexOf("Win 9x 4.90"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows ME"> -1;
InBlock.gif    isWin2K 
= sUserAgent.indexOf("Windows NT 5.0"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 2000"> -1;
InBlock.gif    isWinXP 
= sUserAgent.indexOf("Windows NT 5.1"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows XP"> -1;
InBlock.gif    isWinNT4 
= sUserAgent.indexOf("WinNT"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows NT"> -1 
InBlock.gif              
|| sUserAgent.indexOf("WinNT4.0"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows NT 4.0"> -1 
InBlock.gif              
&& (!isWinME && !isWin2K && !isWinXP);
ExpandedBlockEnd.gif}
 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isMac)  dot.gif {
InBlock.gif    isMac68K 
= sUserAgent.indexOf("Mac_68000"> -1 
InBlock.gif               
|| sUserAgent.indexOf("68K"> -1;
InBlock.gif    isMacPPC 
= sUserAgent.indexOf("Mac_PowerPC"> -1 
InBlock.gif               
|| sUserAgent.indexOf("PPC"> -1;  
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
if  (isUnix)  dot.gif {
InBlock.gif    isSunOS 
= sUserAgent.indexOf("SunOS"> -1;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (isSunOS) dot.gif{
InBlock.gif        
var reSunOS = new RegExp("SunOS (//d+//.//d+(?://.//d+)?)");
InBlock.gif        reSunOS.test(sUserAgent);
InBlock.gif        isMinSunOS4 
= compareVersions(RegExp["$1"], "4.0">= 0;
InBlock.gif        isMinSunOS5 
= compareVersions(RegExp["$1"], "5.0">= 0;
InBlock.gif        isMinSunOS5_5 
= compareVersions(RegExp["$1"], "5.5">= 0;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
文章转自庄周梦蝶  ,原文发布时间5.16
目录
相关文章
|
25天前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
|
15天前
|
JavaScript
事件触发、事件捕获与事件冒泡(js的问题)
事件触发、事件捕获与事件冒泡(js的问题)
|
7天前
|
JavaScript 前端开发 API
框架分析(3)-Vue.js
框架分析(3)-Vue.js
|
17天前
|
JavaScript 前端开发 流计算
JS:oninput和onchange事件的区别
JS:oninput和onchange事件的区别
18 1
|
30天前
|
前端开发 JavaScript 机器人
详解《基于 javascript 的流程图编辑框架LogicFlow
详解《基于 javascript 的流程图编辑框架LogicFlow
42 0
|
1月前
|
JavaScript 前端开发
JS页面加载事件
JS页面加载事件
|
1月前
|
JavaScript
|
1月前
|
JavaScript 前端开发
js阻止浏览器默认事件和防止事件传播事件
js阻止浏览器默认事件和防止事件传播事件
20 3
|
1月前
|
JavaScript
js事件记录(如有更新请留言我去补充)
js事件记录(如有更新请留言我去补充)
|
1月前
|
前端开发 JavaScript 开发者
编程笔记 html5&css&js 014 网页布局框架
编程笔记 html5&css&js 014 网页布局框架