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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
      說明:本文為《JavaScript高級程序設(shè)計》第9章學(xué)習(xí)筆記。

    一.今天的事件

     事件DOM的一部分,在DOM Level1中未定義任何事件,在Level中定義了一小部分子集,完整的事件是在Level3中規(guī)定的,該標準在2004年最終定案。

     Mozilla的事件模式與DOM標準最為接近,IE成為唯一一個對DOM事件模式缺乏良好支持的瀏覽器。

     

    二.事件流

     事件流意味著在頁面上可有不僅一個,甚至多個元素響應(yīng)同一個事件。

    1.       冒泡型事件

    IE上的解決方案的綽號為冒泡的技術(shù)。冒泡型事件的基本思想是,時間按照最特定的目標到最不特定的事件目標的順序觸發(fā)。

    IE6.0中,<html/>元素也可接收冒泡的時間。

    2.       捕獲型事件

    Netscape Navigator4.0使用了捕獲型事件的解決方案。事件從最不確定的對象(document對象)開始觸發(fā),然后到最精確。

    3DOM事件流

           DOM同時支持兩種事件模型:捕獲型事件和冒泡型事件,但是,捕獲型事件先發(fā)生。兩種事件流會觸發(fā)DOM中的所有對象,從document對象開始,也在document對象結(jié)束。

           DOM事件模型的最獨特的性質(zhì)是,文本節(jié)點也觸發(fā)事件(在IE中不會)。

     

    三.時間處理函數(shù)/監(jiān)聽函數(shù)

    事件是用戶或瀏覽器自身進行的特定行為。這些事件都有自己的名字,如clickload等。用于響應(yīng)某個事件而調(diào)用的函數(shù)稱為事件處理函數(shù)

           如果是JavaScript中分配的事件處理函數(shù),則需要首先獲得要處理對象的引用,然后將函數(shù)賦值給事件處理函數(shù)屬性,eg1.

           var oDiv = document.getElementById(“div1”);
           oDiv.onclick 
    = function() {
           alert(“I was clicked.”);
    }

           用這個分配方法,事件處理函數(shù)必須小寫,才能正確響應(yīng)事件。

           Eg2. <div onclick=”alert(‘I was clicked.’)”></div>

    在例二中,事件處理函數(shù)的大小寫可以任意

    1.       IE

    IE中,每個元素和window對象都有兩個方法:attachEvent()detachEvent()attachEvent()用來給一個事件附加事件處理函數(shù)。而detachEvent()用來將事件處理函數(shù)分離出來。Eg.

    var fnClick = function() {
                  alert(“Clicked
    !”);
           }

           
    var oDiv = document.getElementById(“div1”);
           oDiv.attachEvent(“onclick”, fnClick);
           oDiv.detachEvent(“onclick”, fnClick);

    2.       DOM

    DOM方法addEventListener()removeEventListener()用來分配和移除事件處理函數(shù)。與IE不同,這些方法需要三個參數(shù):事件名稱、要分配的函數(shù)和處理函數(shù)用于冒泡階段(為false時)還是捕獲階段(為true時)。Eg.

    oDiv. addEventListener (“onclick”, fnClick, false);

    oDiv.removeEventListener (“onclick”, fnClick, false);

    如果使用傳統(tǒng)方法直接給事件處理函數(shù)屬性賦值,事件處理函數(shù)將被添加到事件的冒泡階段,eg.

    oDiv.onclick = fnClick;

    oDiv.removeEventListener (“onclick”, fnClick, false);

     

    四.             事件對象

    事件對象只在發(fā)生事件時才被創(chuàng)建,且只有事件處理函數(shù)才能訪問。所有事件處理函數(shù)執(zhí)行完畢后,事件對象就被銷毀。

    1.       定位

    IE中,事件對象是window對象的一個屬性event,也就是說,事件處理函數(shù)必須這樣訪問事件對象:

    oDiv.onclick = function() {

            var oEvent = window.event;

    }

    Event對象只能在事件發(fā)生時訪問。所有的事件處理函數(shù)執(zhí)行完畢后,事件對象就被銷毀。

    2.       屬性/方法

    見頁面233-235頁,在此不詳述。

    3.       相似性

    1) 獲取事件類型

    下面代碼可在任何瀏覽器中獲取事件的類型:

    var sType = oEvent.type;

    它返回“click”或“mouseover”之類的值。Eg.

    function handleEvent(oEvent) {
                  
    if (oEvent.type == “click”) {
           alert(“Clicked
    !”);
    }
     else if (oEvent.type == “mouseover”) {
           alert(“mouse over
    !”);
    }

    }

    oDiv.onclick 
    = handleEvent;
    oDiv.onmouseover 
    = handleEvent;

    2) 獲取按鍵代碼

    Eg. var iKeyCode = oEvent.keyCode;

    例如,Enter鍵的keyCode13,空格鍵的keyCode32,回退鍵為8.

    3) 檢測ShiftAltCtrl

    Eg.   var bShift = oEvent.shiftKey;

            var bAlt = oEvent.altKey;

            var bCtrl = oEvent.ctrlKey;

    4) 獲取客戶端坐標

    Eg.  var iClientX = oEvent.clientX;

            var iClientY = oEvent.clientY;

    5) 獲取屏幕坐標

    可用screenXscreenY屬性來獲取鼠標指針在計算機屏幕中的位置

    var iScreenX = oEvent.screenX;

    var iScreenY = oEvent.screenY;

    4.區(qū)別

    1)獲取目標

     IE中:var oTarget = oEvent.srcElement;

     DOM兼容的瀏覽器中:var oTarger = oEvent.target;

    2)獲取字符代碼

    IE中:var iCharCode = oEvent.keyCode;

     DOM兼容的瀏覽器中:var iCharCode = oEvent.charCode;

    3)阻止某個事件的默認行為

    IE中:oEvent.returnValue = false;

     DOM兼容的瀏覽器中:oEvent.preventDefault();

    4)阻止事件復(fù)制(冒泡)

    IE中:oEvent.cancelBubble = true;

     mozilla中:oEvent.stopPropagation ();

     

    五.事件的類型

    DOM標準定義了以下幾種事件:

          鼠標事件
         
    鍵盤事件

          HTML事件:窗口發(fā)生變動或者發(fā)生特定的客戶端-服務(wù)端交互時觸發(fā);

          突變事件:底層的DOM結(jié)構(gòu)發(fā)生改變時觸發(fā)。

    1.       鼠標事件

    Eg. clickdbclickmousedownmouseoutmouseovermouseupmouseover

    1) 屬性

    Eg. 坐標屬性(egclientXclientY等)、type屬性、targetsrcElement屬性、shiftKeyctrlKeyaltKeymetaKeyDOM)屬性、button屬性(只在mousedownmouseovermouseoutmouseovermouseup事件中)。

    2) 順序

    在同一個目標上要按順序發(fā)生以下事件: mousedown->mouseup->click->mousedown->mouseup->click->dbclick

    2.       鍵盤事件

           鍵盤事件有:keydownkeypresskeyup

    1) 事件的屬性

    對某個鍵盤事件,會填入如下的事件屬性: keyCodecharCode(僅DOM)、target(DOM)或者srcElementIE)、shiftKeyctrlKeyaltKeymetaKeyDOM)屬性。

    2) 順序

    按下一個字符鍵,發(fā)生事件順序為: keydown->keypress->keyup;

    按下一個非字符鍵,發(fā)生事件順序為:keydown->keyup

    3.       HTML事件

    HTML事件有: loadunloadaborterrorselectchangesubmitresetresizescrollfocusblur事件。

    1) loadunload事件

    eg. window.onload = function() {

            alert(“loaded!”);

    }

    2) resize事件

    resize事件用來判斷何時動態(tài)的改變某些元素。Eg.

    <body onresize=”alert(‘Resizing’)”>

    最大化或最小化窗口時,也會觸發(fā)resize事件。

    3) Scroll事件

    Eg. <body onscroll=”alert(‘Scroll)”>

    4.變化事件

        變化事件包括如下內(nèi)容:

           DOMSubtreeModified——當(dāng)文檔或者元素的子樹因為添加或刪除節(jié)點而改變時觸發(fā);

           DOMNodeInserted——當(dāng)一個節(jié)點作為另一個節(jié)點的子節(jié)點插入時觸發(fā);

           DOMNodeRemoved——當(dāng)一個節(jié)點作為另一個節(jié)點的子節(jié)點刪除時觸發(fā);

           DOMNodeRemovedFromDocument——當(dāng)一個節(jié)點從文檔中刪除時觸發(fā);

          DOMNodeInsertedIntoDocument——當(dāng)一個節(jié)點插入到文檔中時觸發(fā)。

        這些事件的目的是,提供一個獨立于語言的事件范圍,使其可使用在所有基于XML的語言中。

     

    六.跨平臺的事件

    1. EventUtil對象

         var EventUtil = new Object;

    2. 添加/刪除事件處理函數(shù)

    EventUtil.addEventHandler = function() {
            
    if (oTarget.addEventListener) //對DOM兼容的瀏覽器
           oTarget.addEventListener(sEventType, fnHandler, false);
    }
     else if (oTarget.attachEvent) //對IE
           oTarget.attachEvent("on" + sEventType, fnHandler);
    }
     else {
           oTarget[
    "on" + sEventType] = fnHandler;
    }

    }


    EventUtil.removeHandler 
    = function(oTarget, sEventType, fnHandler) {
            
    if (oTarget.removeEventListener) //對DOM兼容的瀏覽器
                   oTarget.removeEventListener(sEventType, fnHandler, false);
    }
     else if (oTarget.detachEvent) //對IE
           oTarget.detachEvent("on" + sEventType, fnHandler);
    }
     else {
           oTarget[
    "on" + sEventType] = null;
    }

    }

    3. 格式化event對象

         一種對付IEDOM中的event對象之間區(qū)別的最佳手段是,調(diào)整它們使之盡可能地表現(xiàn)相似,因為更多的瀏覽器使用的是DOM的事件類型,所以將IE的事件模型調(diào)整為接近于DOM事件模型就可以了。

        根據(jù)DOM屬性/方法與IE屬性/方法的不同,最后可得出如下的格式化event對象函數(shù),如下所示:

    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;
    }

    4. 獲取事件對象

          IEDOM使用不同的方法來獲取event對象。在IE中,event對象是與window對象相關(guān)的,而在DOM中,它獨立于任何其他對象,并且是作為參數(shù)傳遞的。下面我們編寫一個通用的獲取event對象的函數(shù),代碼如下:

    EventUtil.getEvent = function() {
           
    if (window.event) {
           
    return this.formatEvent(window.event);
    }
     else {
           
    return EventUtil.getEvent.caller.arguments[0];
    }

    }

        調(diào)用舉例如下:

    oDiv.onclick = function() {
            
    var oEvent = EventUtil.getEvent();
    }

    七.  小結(jié)

         本章詳細介紹了JavaScript中事件、事件流的概念,詳細研究了event對象,最后一節(jié)還創(chuàng)建了一個跨瀏覽器事件庫,可使用同一套方法來訪問事件對象,添加/刪除事件處理函數(shù),而無需考慮瀏覽器檢測的問題。

    posted on 2007-08-27 09:17 阿蜜果 閱讀(3776) 評論(9)  編輯  收藏 所屬分類: Javascript


    FeedBack:
    # re: JavaScript學(xué)習(xí)筆記——事件(未完待續(xù))
    2007-08-27 09:58 | kafei
    恩,THX  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2007-09-20 11:37 | 162026094
    可惜無我要的內(nèi)容
      回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2007-09-20 11:43 | 162026094
    我剛畢業(yè)進公司搞開發(fā),用的也JAVA JSP 什么的...很郁悶啊 主管要我做一些我完全不懂的東西 ,硬要我做出來 ..........嗚嗚嗚嗚   回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2007-09-20 12:53 | 阿蜜果
    跟主管好好溝通嘛,多向人家請教,東西都是學(xué)出來的  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2007-11-20 11:02 | Elance
    我剛學(xué)這個。。你的比記作的太好了。。我很想學(xué)到你所學(xué)的程度。。太想了  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2008-07-15 15:09 | lovemoon
    此文是你去年寫的了,確實比我那時強呀。
    你這段代碼有個缺陷:
    oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
    oEvent.pageY = oEvent.clientY + document.body.scrollTop;

    document.body.scrollLeft 標準模式下它始終為0.  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件
    2009-05-15 00:26 | owenson
    謝樓主,看過了文章寫的很容易理解,轉(zhuǎn)走了。
      回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件[未登錄]
    2009-07-01 11:02 | 小劉
    真的非常感謝!我的神啊!!!  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——事件[未登錄]
    2011-11-09 09:39 | 菜菜
    這篇文章對我很有用啊  回復(fù)  更多評論
      
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關(guān)注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 91国内免费在线视频| 一区二区亚洲精品精华液| 亚洲中文字幕伊人久久无码| 国产国产人免费人成免费视频| 国产精品免费看香蕉| 国产麻豆免费观看91| 可以免费观看的一级毛片| heyzo亚洲精品日韩| 亚洲毛片网址在线观看中文字幕| 亚洲国产成人精品女人久久久 | 亚洲精品97久久中文字幕无码| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 亚洲国产综合AV在线观看| 亚洲国产成人久久一区二区三区| 亚洲色大成网站www久久九| 色噜噜噜噜亚洲第一| 三年片在线观看免费观看大全中国| 免费视频精品一区二区| 成年女人A毛片免费视频| 久久aⅴ免费观看| 色播精品免费小视频| 成人免费视频软件网站| 免费又黄又爽的视频| 亚洲中文字幕久久精品无码喷水| 日本红怡院亚洲红怡院最新| 亚洲精品在线播放视频| 亚洲日韩AV一区二区三区中文 | 亚洲视频在线观看网站| 亚洲一区二区三区高清不卡| 朝桐光亚洲专区在线中文字幕 | 国产精品亚洲综合五月天| 美女免费视频一区二区三区| 久久嫩草影院免费看夜色| 91精品全国免费观看含羞草| 成人免费午间影院在线观看| 亚洲精品97久久中文字幕无码| 亚洲一区中文字幕久久| 亚洲国产高清国产拍精品| 成人网站免费大全日韩国产| 亚洲一级免费视频| 国产一级淫片免费播放|