<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。
    主站蜘蛛池模板: 一个人免费观看www视频| 黄色片在线免费观看| 成人免费在线观看网站| 亚洲av永久无码精品网站| 老司机午夜在线视频免费观| 性做久久久久久久免费看| 亚洲毛片免费观看| 老汉精品免费AV在线播放| 亚洲av综合avav中文| 国内自产拍自a免费毛片| 亚洲永久网址在线观看| 99无码人妻一区二区三区免费| 久久精品九九亚洲精品| 国产拍拍拍无码视频免费| 中文字幕一精品亚洲无线一区| 另类专区另类专区亚洲| 又大又硬又爽免费视频| 欧洲美女大片免费播放器视频| 免费在线一级毛片| 999任你躁在线精品免费不卡| 日日摸日日碰夜夜爽亚洲| 免费又黄又硬又爽大片| 日本视频一区在线观看免费| 亚洲狠狠狠一区二区三区| 国产亚洲视频在线播放| 成年在线网站免费观看无广告 | 免费看的黄色大片| 女bbbbxxxx另类亚洲| 亚洲一区二区三区四区在线观看 | 亚洲综合国产一区二区三区| 啦啦啦中文在线观看电视剧免费版 | 亚洲国产成人精品无码久久久久久综合 | 亚洲午夜福利精品久久 | 国产白丝无码免费视频| 亚洲人成7777影视在线观看| 女人18一级毛片免费观看| 91人成网站色www免费下载| 亚洲人成色777777精品| mm1313亚洲精品国产| 国产午夜不卡AV免费| 亚洲中文无码线在线观看|