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

資訊專欄INFORMATION COLUMN

js 事件委托 事件代理

widuu / 2336人閱讀

摘要:事件委托事件代理高級程序設(shè)計上解釋事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。事件委托原理事件委托是利用事件的冒泡原理來實現(xiàn)的,事件冒泡就是事件從最深的節(jié)點開始,然后逐級向上傳播事件。

js 事件委托 事件代理
JavaScript高級程序設(shè)計上解釋:事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。
通過例子類比:

有三個同事預(yù)計會在周一收到快遞。為簽收快遞,有兩種辦法:一是三個人在公司門口等快遞;二是委托給前臺MM為簽收。現(xiàn)實中,我們大都采用委托的方案。前臺MM收到快遞后,會判斷收件人是誰,然后按照收件人的要求簽收。這種方案的優(yōu)勢就是無論有多少個新員工要收快遞,前臺MM都可以代為簽收。
這里有兩層意思:
第一,現(xiàn)在委托前臺的同事是可以代為簽收的,即程序中的現(xiàn)有的DOM節(jié)點是有事件的;
第二,新員工也是可以被前臺MM代為簽收的,即程序中新添加的DOM節(jié)點也是有事件的。

為什么要有事件委托:

如果很多個DOM需要添加事件處理,比如100個li都有相同的click點擊事件,可能我們會用for循環(huán)的方法,來遍歷所有的li,然后給它們添加事件。在JavaScript中,添加到頁面上的事件處理程序數(shù)量將直接關(guān)系到頁面的整體運行性能,因為需要不斷的與DOM節(jié)點進行交互,訪問DOM的次數(shù)越多,引起瀏覽器重繪與重排的次數(shù)也就越多,就會延長整個頁面的交互就緒時間,這就是性能優(yōu)化要減少DOM操作的原因:如果用事件委托,就會將所有的操作放到j(luò)s程序里,與DOM的操作就只需交互一次,這樣就能減少與DOM的交互次數(shù),提高性能;
每個函數(shù)都是一個對象,是對象就會占用內(nèi)存,對象越多,內(nèi)存占用率就越大,性能也就會相應(yīng)下降。比如上面的100個li,就要占用100個內(nèi)存空間,如果是1000,10000個,性能影響更加明顯。如果采用事件委托,就只需對它的父級(如果只有一個父級)這一個對象進行操作,我們就只需要一個內(nèi)存空間就夠了,性能也會相應(yīng)的提高。

事件委托原理:

事件委托是利用事件的冒泡原理來實現(xiàn)的,事件冒泡就是事件從最深的節(jié)點開始,然后逐級向上傳播事件。舉個例子:頁面上有一個節(jié)點樹,div>ul>li>a;比如給最里面的a加一個click點擊事件,那么這個事件愛你就會逐層向外執(zhí)行,執(zhí)行順序為a>li>ul>div,事件委托的機制就在于我們可以給最外面的div加點擊事件,那么里面的ul,li,a做點擊事件的時候,都會冒泡到最外層的div上,委托它們的父級代為執(zhí)行事件。

事件委托怎么實現(xiàn):

首先看一個例子:
子節(jié)點實現(xiàn)相同的功能:

  • 111
  • 222
  • 333
  • 444

實現(xiàn)的功能是點擊li,彈出123

window.onload = function(){
    var oUl = document.getElementById("ul1");
    var aLi = oUl.getElementsByTagName("li");
    for(var i=0;i

上面代碼首先找到ul,然后遍歷li,然后點擊li的時候,又要找一次目標(biāo)的li的位置,才能執(zhí)行最后的操作,每次點擊都要找一次li;

如果用事件委托的方式做呢:

window.onload = function(){
    var oUl = document.getElementById("ul1");
   oUl.onclick = function(){
        alert(123);
    }
}

這里用父級ul做事件處理,當(dāng)li被點擊時,由于冒泡原理,事件就會冒泡到ul上,因為ul上有點擊事件,所以事件就會觸發(fā),但是這樣點擊ul也會觸發(fā),解決方案:
Event對象提供了一個屬性叫target,可以返回事件的目標(biāo)節(jié)點,我們稱為事件源。即target可以表示為當(dāng)前的事件操作的DOM。兼容性問題:標(biāo)準(zhǔn)瀏覽器用ev.target,IE瀏覽器用event.srcElement,此時只是獲取了當(dāng)前節(jié)點的位置,可以用nodeName來獲取具體是什么標(biāo)簽名,這里返回是大寫的,需要轉(zhuǎn)成小寫toLowerCase()來做比較.

window.onload = function(){
  var oUl = document.getElementById("ul1");
  oUl.onclick = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    if(target.nodeName.toLowerCase() == "li"){
            alert(123);
         alert(target.innerHTML);
    }
  }
}

這樣就只有點擊li會觸發(fā)事件,且每次只執(zhí)行一次DOM操作,如果li數(shù)量很多的話,將大大減少DOM的操作,優(yōu)化性能。

上面的例子是每個li操作是同樣的效果,如果每個li被點擊的效果不一樣呢:

window.onload = function(){
            var Add = document.getElementById("add");
            var Remove = document.getElementById("remove");
            var Move = document.getElementById("move");
            var Select = document.getElementById("select");
            
            Add.onclick = function(){
                alert("添加");
            };
            Remove.onclick = function(){
                alert("刪除");
            };
            Move.onclick = function(){
                alert("移動");
            };
            Select.onclick = function(){
                alert("選擇");
            }
            
        }

上面代碼4個按鈕,點擊每一個做不同的操作,至少需要4次DOM操作,用事件委托進行優(yōu)化:

window.onload = function(){
            var oBox = document.getElementById("box");
            oBox.onclick = function (ev) {
                var ev = ev || window.event;
                var target = ev.target || ev.srcElement;
                if(target.nodeName.toLocaleLowerCase() == "input"){
                    switch(target.id){
                        case "add" :
                            alert("添加");
                            break;
                        case "remove" :
                            alert("刪除");
                            break;
                        case "move" :
                            alert("移動");
                            break;
                        case "select" :
                            alert("選擇");
                            break;
                    }
                }
            }
            
        }

用事件委托就只用一次DOM操作就能完成操作,提高性能

上面講的都是document加載完成的現(xiàn)有DOM節(jié)點下的操作,如果是新增節(jié)點的會有事件嗎?


    
  • 111
  • 222
  • 333
  • 444

現(xiàn)在是移入lili變紅,移出lili變白,這樣一個效果,然后點擊按鈕,可以向ul中添加一個li子節(jié)點

window.onload = function(){
            var oBtn = document.getElementById("btn");
            var oUl = document.getElementById("ul1");
            var aLi = oUl.getElementsByTagName("li");
            var num = 4;
            
            //鼠標(biāo)移入變紅,移出變白
            for(var i=0; i

執(zhí)行后發(fā)現(xiàn),新增的li是沒有事件的,說明在添加子節(jié)點的時候,事件沒有一起添加進去。解決方案就是將for循環(huán)用一個函數(shù)包起來,命名mHover

window.onload = function(){
            var oBtn = document.getElementById("btn");
            var oUl = document.getElementById("ul1");
            var aLi = oUl.getElementsByTagName("li");
            var num = 4;
            
            function mHover () {
                //鼠標(biāo)移入變紅,移出變白
                for(var i=0; i

雖然功能實現(xiàn)了,但實際上有增加了一個DOM操作,不利于性能,用事件委托優(yōu)化

window.onload = function(){
            var oBtn = document.getElementById("btn");
            var oUl = document.getElementById("ul1");
            var aLi = oUl.getElementsByTagName("li");
            var num = 4;
            
            //事件委托,添加的子元素也有事件
            oUl.onmouseover = function(ev){
                var ev = ev || window.event;
                var target = ev.target || ev.srcElement;
                if(target.nodeName.toLowerCase() == "li"){
                    target.style.background = "red";
                }
                
            };
            oUl.onmouseout = function(ev){
                var ev = ev || window.event;
                var target = ev.target || ev.srcElement;
                if(target.nodeName.toLowerCase() == "li"){
                    target.style.background = "#fff";
                }
                
            };
            
            //添加新節(jié)點
            oBtn.onclick = function(){
                num++;
                var oLi = document.createElement("li");
                oLi.innerHTML = 111*num;
                oUl.appendChild(oLi);
            };
        }

上面就是利用事件委托的方式,新添加的子元素是帶有事件效果的。當(dāng)用事件委托的時候,不需要去遍歷元素的子節(jié)點,只需要給父級元素添加事件就可以了,其他的都是在js里面執(zhí)行,這樣就可以減少DOM操作,提高性能,這也是事件委托的優(yōu)點。

適用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress
(mouseover事件:不論鼠標(biāo)指針穿過被選元素或其子元素,都會觸發(fā)mouseover事件;mouseenter事件:只有鼠標(biāo)指針穿過被選元素時,才會觸發(fā)mouseenter事件。)

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

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

相關(guān)文章

  • js事件代理委托

    摘要:本文要解釋一下事件的代理或者說委托的概念,首先直接上定義事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。這種委托父元素執(zhí)行事件,并利用事件冒泡的原理執(zhí)行子元素相應(yīng)函數(shù)的方法就叫事件的代理,或者叫事件的委托。 本文要解釋一下JavaScript事件的代理或者說委托的概念,首先直接上定義:事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的...

    lewif 評論0 收藏0
  • JavaScript 事件代理委托

    摘要:原文地址事件代理和委托在中這個詞經(jīng)常出現(xiàn),看字面的意思,代理委托。模型將事件處理流程分為三個階段一事件捕獲階段,二事件目標(biāo)階段,三事件起泡階段。事件目標(biāo)當(dāng)?shù)竭_目標(biāo)元素之后,執(zhí)行目標(biāo)元素該事件相應(yīng)的處理函數(shù)。 原文地址:JavaScript 事件代理和委托 在javasript中delegate這個詞經(jīng)常出現(xiàn),看字面的意思,代理、委托。那么它究竟在什么樣的情況下使用?它的原理又是什么?在...

    littlelightss 評論0 收藏0
  • 淺談Javascript事件委托代理

    摘要:開玩笑啦,提供一種方法叫做事件委托。途中經(jīng)過各個層次的,并在各上觸發(fā)捕獲事件,直到到達時間的目標(biāo)。懂得了事件冒泡的過程,就很容易明白事件委托的運作原理。 首先祝大家七夕快樂。。假如現(xiàn)在有一個的列表,里面可能會有若干個列表項。現(xiàn)在要為每一個列表項綁定相同的點擊事件,現(xiàn)在你可能會有這幾種做法: 手動為每一個列表項綁定事件; 在onload的時候,找到該列表,對其每一個子元素進行遍歷,循環(huán)...

    yunhao 評論0 收藏0
  • 【筆記】事件委托(即事件代理)知識點

    摘要:事件委托就是事件目標(biāo)自身不處理事件,而是把處理任務(wù)委托給其父元素或者祖先元素,甚至根元素。 事件委托原理 事件委托就是利用事件冒泡原理實現(xiàn)的! 事件冒泡:就是事件從最深節(jié)點開始,然后逐步向上傳播事件; 例:頁面上有一個節(jié)點樹,div > ul > li > a 比如給最里面的a 加一個click事件,那么事件就會一層一層的往外執(zhí)行,執(zhí)行順序 a > li > ul > div...

    forrest23 評論0 收藏0
  • JS - 關(guān)于事件委托中的事件冒泡

    摘要:結(jié)構(gòu)如下項目名稱項目名稱列篩選圖標(biāo)代碼如下點擊列篩選圖標(biāo)這種事件委托的事件綁定方式,在這里出現(xiàn)了事件冒泡,雖然調(diào)用了,但仍然會觸發(fā)綁定在上的排序事件。 在使用 Datatables 表格插件開發(fā)過程中,給每一列的表頭增加了自定義的列篩選功能,具體是給表頭增加了一個可點擊的圖標(biāo),點擊圖標(biāo)觸發(fā)篩選,但是發(fā)現(xiàn)點擊圖標(biāo)的時候同時會觸發(fā) Datatables 自帶的排序功能。 showImg(h...

    wuaiqiu 評論0 收藏0

發(fā)表評論

0條評論

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