国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js 事件詳解1--事件流

luxixing / 950人閱讀

摘要:同樣還是用上面冒泡例子,則事件的傳播順序則是特別說明之前不支持事件捕獲,,,,,目前支持良好。取決于指定事件處理程序的方法。

第一次在segmentfault寫文章,希望通過這種方式來鞏固所學的知識,也歡迎童鞋們指正其中有不對和錯誤的地方。^+^

事件流

事件流:頁面中接收事件的順序,即當一個事件發(fā)生時,該事件的傳播過程便叫做事件流

事件流的種類

事件冒泡

事件由最具體的元素開始逐級向上傳播至較為不具體的節(jié)點(文檔)




    
    


點我

當我們點擊id為box的div時,該點擊事件傳播順序如下

div --> body --> html -->document

特別說明:IE5.5及更早的版本將繞過html節(jié)點直接到document,IE9,F(xiàn)irefox,chrome和safari將冒泡到window對象

事件捕獲

事件捕獲和事件冒泡似乎截然相反,由不太具體的節(jié)點先接收到事件 -->再到最具體的節(jié)點。同樣還是用上面冒泡例子,則事件的傳播順序則是:
document --> html -->body -->div

特別說明:ie8之前不支持事件捕獲,IE9,safari,chrome,opera,firefox目前支持良好。并且這些瀏覽器不是從document開始捕獲,而是從window對象開始。

DOM事件流階段

捕獲階段

目標階段

冒泡階段

以上面的代碼為例子,由圖可以很清晰地看出首先發(fā)生的是事件捕獲-->實際的目標接收事件-->事件冒泡

特別說明:在DOM事件流中,實際的目標不會在捕獲階段接收到事件,即捕獲階段到body就停止,"下一階段"是目標階段,該階段可以看成是事件冒泡的一部分,最終事件又被傳播會document。
BUT :我們的各大瀏覽器總是不喜歡按照規(guī)范來,IE9,Safari,chrome,firefox及其更高的版本中都會在捕獲階段出發(fā)事件對象上的事件,最后導致有兩個機會在目標對象上操作事件。

事件處理程序

事件:用戶或者瀏覽器自身執(zhí)行的某個動作,比如load,click,mousemove等
事件處理程序:相應(yīng)某個事件的函數(shù)叫做事件處理函數(shù)(也叫做事件偵聽器

事件處理程序類別

1 html事件處理程序:某個元素支持的某個事件可以用與事件處理程序同名的html特性來指定,該特性的值是能夠執(zhí)行的javascript代碼。



/*
   當點擊該按鈕的時候,瀏覽器會彈出"我被點擊了";
*/

當然也可以給onclick賦值頁面中其他地方定義的腳本



優(yōu)點:簡單明了,省去獲取元素等一系列前提操作
缺點:html代碼與js代碼高度耦合,不符合分離原則

2 DOM0級別事件處理函數(shù):使用 element.on[eventname]=fn的方式給元素添加事件


3 DOM2級事件處理程序:DOM2級添加了addEventListener(添加事件處理程序)和removeEventListener(移除事件處理程序)
添加事件處理函數(shù)


移除事件處理函數(shù):如果事件處理函數(shù)是有名函數(shù),則可以通過名字來移除,匿名函數(shù)無法移除。


        

4IE事件處理程序:ie實現(xiàn)了與dom類似的兩個方法,attachEvent(添加),detachEvent(刪除)
添加事件處理函數(shù)


刪除事件處理函數(shù)


事件函數(shù)封裝

綁定 為了解決attachEvent的this指向問題,并且可以通過有名稱的函數(shù)來解除事件綁定,現(xiàn)在處理如下

//
   function bind(obj,eventName,fn){
        var _fn=fn;
        fn=function(){
            _fn.call(obj);//改變this指向
        };
        if(obj.addEventListener){
            obj.addEventListener(eventName,fn,false);
        }else{
            obj.attachEvent("on"+eventName,fn);
        }
        return fn;//用于事件解除
    }

解除

     function unbind(obj,eventName,fn){
        if(obj.removeEventListener){
            obj.removeEventListener(eventName,fn);
        }else{
            obj.detachEvent("on"+eventName,fn);
        }
    }

使用方式

    //給input添加和移除事件
    
    //添加
    function show( ){
        alert(this);
    }
    function show2( ){
        alert(this.id);
    }
    
    var removeFn=bind("box","click",show);//需要移除的事件處理程序,不是原程序名稱show
    bind("box","click",show2);
    unbind("box","click",removeFn);
    //最后只會彈出 box
    
事件對象

當觸發(fā)DOM上面的某個事件的時候,會產(chǎn)生一個事件對象event,這個對象中包含著所有與事件對象有關(guān)的信息。例如該事件類型導致事件的元素

DOM中的事件對象

DOM中的事件對象:兼容DOM的瀏覽器會將event對象傳入到事件處理程序中,無論指定事件處理程序用什么方式(html方式,DOM0級方式,DOM2級方式)

    
    //html方法  click
   var oBox=document.getElementById("box");
    //DOM0級別方法 click
        oBox.onclick=function(ev){
            console.log(ev.type);//click
        }
    ///DOM2級別方法 click
    oBox.addEventListener("click",function(ev){
            console.log(ev.type);//click
        })     

總的來說event對象包含與創(chuàng)建他的特定事件有關(guān)的屬性和方法,但是觸發(fā)的事件類型不同,則可用的屬性和方法也不一樣。但是都會包含以下成員

屬性/方法 類型 讀/寫 說明
currentTarget element 只讀 事件處理程序當前正在處理程序的那個元素,我的理解是事件的直接綁定者
target element 只讀 事件的目標
cancelable boolean 只讀 表示是否可以取消事件的默認行為
preventDefault() function 只讀 取消事件的默認行為 ,前提是cancelable為true
bubbles boolean 只讀 表明事件是否可以冒泡
stopPropagation() function 只讀 取消事件的進一步冒泡或者捕獲,前提是bubbles為true
type boolean 只讀 事件類型
view abstractView 只讀 與事件關(guān)聯(lián)的抽象視圖,等同于發(fā)生事件的window對象
detail integer 只讀 與事件相關(guān)的細節(jié)信息
eventPhase integer 只讀 調(diào)用事件處理程序的階段,1::捕獲,2:“處于目標”,3:冒泡
trusted boolean 只讀 為true表示事件是由瀏覽器生成的,為false表示事件是由開發(fā)人員通過js生成的。(DOM3)
stopImmediatePropagation() function 只讀 取消事件的進一步捕獲或者冒泡,同時阻止任何事件處理程序被調(diào)用(DOM3)

特別說明:只有在事件處理程序被執(zhí)行的期間,event對象才會存在,一旦事件處理程序執(zhí)行完成,其就會被銷毀。

IE中的事件對象

與訪問DOM中的事件對象不同,要訪問IE中的event對象有幾種不同的方式。取決于指定事件處理程序的方法。

html event

函數(shù)參數(shù)

window.event

同樣IE中的event對象也包含著與創(chuàng)建他的事件相關(guān)的屬性和方法,其中很多的屬性和方法都有對應(yīng)的或者是相關(guān)的DOM屬性和方法。當然也會事件的不同,其屬性和方法也會有所不同,但是都會包含下表內(nèi)容

屬性/方法 類型 讀/寫 說明
srcElement element 只讀 事件的目標(與DOM中的target屬性相同)
type string 只讀 事件的類型
cancelBubble boolean 只讀 默認為false,設(shè)置為true表示取消冒泡(與stopPropagation()作用相同)
returnValue boolean 只讀 默認為true,設(shè)置為false就可以取消默認行為(與preventDefault()作用相同)
跨瀏覽器事件對象封裝

我們?yōu)閑ventUtil添加幾個方法,以此來達到有關(guān)event對象的常用的跨瀏覽器的使用目標

getEvent() 獲取事件對象

getTarget()獲取事件源

stopPropagation() 取消冒泡

preventDefault() 阻止默認行為

   var eventUtil={
        getEvent:function(ev){
            return ev || window.event;//獲取事件對象
        },
        getTarget:function(ev){
            return ev.target || ev.srcElement;//獲取事件源
        },
        stopPropagation:function(ev){//阻止冒泡
            if(ev.stopPropagation){
                ev.stopPropagation();
            }else{
                ev.cancelBubble=true;
            }
        },
        preventDefault:function(ev){//阻止默認行為
            if(ev.preventDefault){
                ev.preventDefault();
            }else{
                ev.returnValue=true;
            }
        }
    }
常見應(yīng)用之事件委托

說明:需要給頁面中成百上千個li綁定一個事件并且輸出當前元素的innerHTML
常見做法

    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
var aLi //假設(shè)已經(jīng)獲取了這組li元素 for(var i=0;i

這種方式通過遍歷DOM節(jié)點的方式添加事件處理程序有諸多缺點,比如性能大大減低,新添加的li不具備click事件等。

利用事件委托(冒泡原理)

    var oUl//假設(shè)oUl是li的父節(jié)點
    oUL.onclick=fuction(ev){
        var ev=eventUtil.getEvent(ev);
        var target=eventUtil.getTarget(ev);
            console.log(target.innerHTML);
    }

利用事件委托可以大大地提高性能,后面隨時添加的元素都可以擁有這個點擊事件等

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/86046.html

相關(guān)文章

  • 詳解JS事件 - 事件模型/事件/事件代理/事件對象/自定義事件

    摘要:取消事件的默認行為。阻止事件的派發(fā)包括了捕獲和冒泡阻止同一個事件的其他監(jiān)聽函數(shù)被調(diào)用。 事件模型 DOM0 級事件模型 -沒有事件流,這種方式兼容所有瀏覽器 // 方式一 將事件直接通過屬性綁定在元素上 / 方式二 獲取到頁面元素后,通過 onclick 等事件,將觸發(fā)的方法指定為元素的事件 var btn = document.getElementById(btn) btn....

    URLOS 評論0 收藏0
  • js事件詳解

    摘要:使用級方法指定的事件處理程序被認為是元素的方法。用于立即停止事件在中的傳播,取消進一步的事件捕獲或冒泡。捕獲事件目標對象冒泡只有在事件處理程序執(zhí)行期間,對象才會存在,執(zhí)行完成后,對象就會被銷毀。 引用 事件是我認為前端最特別的地方,這是唯一其他語言不一樣的地方,我們通過它與頁面進行交互。 事件流 事件流描述的是從頁面中接收事件的順序。IE和網(wǎng)景團隊提出流相反的事件流概念。IE事件流是事...

    AlienZHOU 評論0 收藏0
  • js事件詳解

    摘要:使用級方法指定的事件處理程序被認為是元素的方法。用于立即停止事件在中的傳播,取消進一步的事件捕獲或冒泡。捕獲事件目標對象冒泡只有在事件處理程序執(zhí)行期間,對象才會存在,執(zhí)行完成后,對象就會被銷毀。 引用 事件是我認為前端最特別的地方,這是唯一其他語言不一樣的地方,我們通過它與頁面進行交互。 事件流 事件流描述的是從頁面中接收事件的順序。IE和網(wǎng)景團隊提出流相反的事件流概念。IE事件流是事...

    xioqua 評論0 收藏0
  • js事件詳解

    摘要:事件流事件流描述的是從頁面中接收事件的順序。其次,必須事先指定所有事件處理程序而導致的訪問次數(shù),會延遲整個頁面的交互就緒時間。 1.事件流 事件流描述的是從頁面中接收事件的順序。 1.1 事件冒泡 IE中的事件流叫做冒泡,即時間最開始由最具體的元素接收,然后逐級向上傳播到較為不具體的節(jié)點,直到傳播到document對象。例: Event Exampple ...

    BDEEFE 評論0 收藏0
  • Node.js知識點詳解(三)緩沖與模塊

    摘要:緩沖模塊起初就是為瀏覽器而設(shè)計的,所以能很好的處理編碼的字符串,但不能很好的處理二進制數(shù)據(jù)。有如下三個主要的流標準輸入標準輸出標準錯誤可讀流如果說,緩沖區(qū)是處理原始數(shù)據(jù)的方式的話,那么流通常是移動數(shù)據(jù)的方式。該方法讓可讀流繼續(xù)觸發(fā)事件。 緩沖(buffer)模塊 js起初就是為瀏覽器而設(shè)計的,所以能很好的處理unicode編碼的字符串,但不能很好的處理二進制數(shù)據(jù)。這是Node.js的...

    plus2047 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<