三爪的JS奋斗史---事件

1.       5JavaScriptHTML之间的交互是通过用户和浏览器操作页面时引发的事件(event)来处理的

 

2.       事件流 冒泡(IE)捕捉(NN DOM事件流 同时支持两种事件流。

 

3.       事件发生顺序是浏览器事件支持的主要差别

 

4.       DOM事件模型最独特的性质是,文本节点也触发事件

 

5.       事件是用户或浏览器自身进行的特定行为.这些事件都有自己的名字,如click,load,mouseover。用于响应某个事件而调用的函数称为 事件处理函数(event handler

或者DOM称之为 事件监听函数(event listener

 

6.       将函数赋值给对应的事件处理函数属性,事件处理函数的名称必须小写,才能正确响应。

 

直接赋值事件处理函数 是另一种addEventListener()的调用方式,但直接复制与函数复制有一个很重要的不同点:后续对事件处理函数的赋值清除前面的赋值

 

 

 

7.       事件对象(Event)

刚刚发生的时间的信息会产生事件对象,里面包含的信息有:

           引起事件的对象

           事件发生时鼠标的信息

           事件发生时键盘的信息

事件对象只在发生事件时才被创建,且只有事件处理函数才能访问.所有事件处理函数执行完毕后,事件对象被销毁

 

DOM   event对象必须作为唯一的参数传给事件处理函数

 

8.       事件的类型

根据触发事件的事物和事件发生的对象,可将浏览器中发生的时间分成几个类型

DOM定义一下事件

 

鼠标事件:使用数遍进行特定操作时触发.

鼠标事件是WEB上最常用的事件类型.包含了

      Click --- 点击鼠标左键时发生,当用户的焦点在按钮上,并按了回车键,同样会触发这个事件.

      dblclick --- 双击鼠标左键时发生.

      Mousedown --- 点击任意一个鼠标按钮时发生

      Mouseout --- 鼠标指针在某个元素上,且用户正要将其移出元素的边界时发生

      Mouseover --- 鼠标移出某个元素到另一个元素上时发生

      Mouseup --- 用户松开任意一个按钮时发生

 事件处理函数被认为是分配给对象的方法

 

鼠标的属性

每个鼠标事件都会给以下event对象的属性填入值

坐标属性(如clientX client 等)

Type属性

Targer(DOM)serElementIE)属性(目标对象属性)

shiftKeyctrlKeyaltKeymetaKeyDOM)属性

       button属性(只在mouse事件中)

      

       oEvent.target || oEvent.srcElement.id

        逻辑符或操作符作用于两个对象时,第一个对象非空,返回第一个对象,否则返回第二个对象

 

      

键盘事件:用户在键盘上敲击,输入时触发.

    Keydown   --- 在键盘上按下某按键时发生。一直按着某键,它则会不断触发

Keypress   --- 按下一个按键,并产生一个字符时产生(也就是不管类似Shit ctrl alt之类的键。)一直按键时,它会持续发生

Keyup         --- 释放按着的按键时发生

 

1.       事件的属性

keyCode属性(键位的ASC码值)

charCode属性(仅DOM

target srcElement 属性

shiftKey ctrlKeyaltKeymetaKeyDOM)属性

        

HTML事件:窗口发生变动或发生特定的客户端-服务器端时触发.

Load事件:页面完全载入后,在window对象上触发;所有的框架都载入后,在框架集上触发;

           <img/>完全载入后,在其上触发;或对于<object/>元素,当其完全载入后在其上触发

 

Unload事件:页面、框架、<img/><object/>卸载后,对象上触发;

   

Abort事件用户停止下载过程时,如果<object/>对象还未完全载入,就在其上触发.

 

Error事件:JS脚本出错时。在window对象上触发;某个<img/>的指定图像无法载入时,在其上触发;或<object/>元素无法载入时触发;或者框架集中的一个或多个框架无法载入时触发。

 

Select事件:用户选择了文本框中的一个或多个字符时触发

 

Change事件:文本框(<input/>或者<textarea/>)失去焦点时并且在它获取焦点后内容发生过改变时触发;某个 <select/>元素的值发生改变时触发.

       Submit事件:点击提交按钮,在<form/>上触发.

      

       Reset事件: 点击重置按钮时,在<form/>上触发

 

Resize事件:窗口或框架的大小发生改变时触发

 

Scroll事件: 用户在任何带滚动条的元素上卷动它时触发

 

Focus事件: 任何元素或者窗口本身获取焦点时(点击,tab键切换或者任何与它交互的手段)时触发

   

Blur事件:  任何元素或者窗口本身失去焦点时触发

 

突变事件:底层的DOM结构发生改变时触发.

             暂无主流浏览器支持.很明显,偷懒了

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

跨平台的事件

 很明显重点来了.

先提供一个浏览器与操作系统判断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;

    }

}

 

 

//eventutil.js,来自《JAVASCRIPT高级程序设计》

var EventUtil = new Object;    

     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;

           }

        }      

      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;

           }

        }

     

     EventUtil.formatEvent = function (oEvent){

      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.relatedTarget = 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;

     }

     EventUtil.getEvent = function(){

      if(window.event){

           return this.formatEvent(window.event);

       }else{

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

       }

     }

 

 

posted @ 2009-12-07 11:13  三爪  阅读(237)  评论(0)    收藏  举报