<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    javascript事件模型框架

    Posted on 2007-02-06 13:58 dennis 閱讀(3068) 評論(1)  編輯  收藏 所屬分類: web開發
    ?最近一直在讀《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;
    ????}

    }


    評論

    # re: javascript事件模型框架  回復  更多評論   

    2007-04-27 00:08 by Gloridea
    請參看:http://sosuo8.com/article/show.asp?id=165
    該選項卡FF下無效,是否與您的這篇文章所說有關?
    另外,該選項卡打開后不能自動收回,是怎么回事?
    謝謝!
    我加你的MSN。
    主站蜘蛛池模板: 中文字幕在线视频免费| 2021国内精品久久久久精免费| 国产午夜亚洲精品午夜鲁丝片| 一级做a爰片性色毛片免费网站 | 国产成人免费永久播放视频平台| j8又粗又长又硬又爽免费视频| 2022年亚洲午夜一区二区福利| 日韩成人在线免费视频| 国产成人一区二区三区视频免费 | 日韩在线不卡免费视频一区| 久久综合亚洲色hezyo| 亚洲av中文无码乱人伦在线咪咕 | 亚洲一区二区三区四区在线观看| 女人被男人躁的女爽免费视频| 在线看片免费人成视频久网下载| 中文字幕亚洲综合久久综合| 亚洲av无码国产精品夜色午夜| 日韩a级毛片免费视频| 在线看片免费人成视久网| 一个人晚上在线观看的免费视频 | 美女被免费网站91色| 亚洲国产系列一区二区三区| 亚洲A∨无码一区二区三区| 四虎国产精品免费视| 免费不卡视频一卡二卡| 免费看男人j放进女人j免费看| 高潮毛片无遮挡高清免费| 亚洲AV无码久久久久网站蜜桃| 亚洲人成网亚洲欧洲无码久久| 国产美女做a免费视频软件| 97性无码区免费| 日本免费一区二区久久人人澡| 极品美女一级毛片免费| 亚洲日本VA午夜在线影院| 亚洲成年人免费网站| 日本亚洲国产一区二区三区| 一级毛片直播亚洲| 在线免费观看韩国a视频| 国产免费久久精品99re丫y| 99久久久国产精品免费牛牛| 免费毛片在线看不用播放器|