1. 程式人生 > >js中事件繫結3種方法以及事件委託

js中事件繫結3種方法以及事件委託

事件繫結

首先,我先來介紹我們平時繫結事件的三種方法。
1.嵌入dom

<button onclick="open()">按鈕</button>

<script>
function open(){
    alert(1)
}
</script>

2.直接繫結

<button id="btn">按鈕</button>
<script>
document.getElementById('btn').onclick = function(){
    alert(1)
}
</script>

3.事件監聽

<button id="btn">按鈕</button>
<script>
document.getElementById('btn').addEventListener('click',function(){
    alert(1)
})
//相容IE
document.getElementById('btn').attachEvent('click',function(){
    alert(1)
})
</script>

事件委託

對“事件處理程式過多”問題的解決方案就是事件委託。事件委託利用了事件冒泡,只制定一個事件處理程式,就可以管理某一型別的所有事件。例如click事件一直會冒泡到document層。也就是我們可以只指定onclick事件處理程式,而不必給每個事件分別新增處理程式。
下面我們來看一個阿里巴巴筆試題的例子。

這裡寫圖片描述

樣式以及DOM結構

 <style>
   * {
     padding: 0;
     margin: 0;
   }

   .head, li div {
     display: inline-block;
     width: 70px;
     text-align: center;
   }

   li .id, li .sex, .id, .sex {
     width: 15px;
   }

   li .name, .name {
     width: 40px;
   }

   li .tel, .tel {
     width: 90
px
; }
li .del, .del { width: 15px; } ul { list-style: none; } .user-delete { cursor: pointer; }
</style> </head> <body> <div id="J_container"> <div class="record-head"> <div class="head id">序號</div><div class="head name">姓名</div><div class="head sex">性別</div><div class="head tel">電話號碼</div><div class="head province">省份</div><div class="head">操作</div> </div> <ul id="J_List"> <li><div class="id">1</div><div class="name">張三</div><div class="sex"></div><div class="tel">13788888888</div><div class="province">浙江</div><div class="user-delete">刪除</div></li> <li><div class="id">2</div><div class="name">李四</div><div class="sex"></div><div class="tel">13788887777</div><div class="province">四川</div><div class="user-delete">刪除</div></li> <li><div class="id">3</div><div class="name">王二</div><div class="sex"></div><div class="tel">13788889999</div><div class="province">廣東</div><div class="user-delete">刪除</div></li> </ul> </div> </body>

不用事件委託。而這種方法造成的代價是,效能的大量浪費。如果是成千上萬條資料,頁面將會嚴重卡頓,甚至崩潰。

function Contact(){
    this.init();
}


Contact.prototype.init = function(){
    var userdel = document.querySelectorAll('.user-delete');
    for(var i=0;i<lis.length;i++){
        (function(j){
            userdel[j].onclick = function(){
    userdel[j].parentNode.parentNode.removeChild(userdel[j].parentNode);
            }
        })(i);
    }   
}

new Contact();

使用事件委託,只繫結一次事件,大大減少了效能的損耗。也是在需要大量事件處理程式中一種非常好的解決方式。

function Contact(){
    this.init();
}


Contact.prototype.init = function(){
    var lis = document.querySelector('#J_List');
    lis.addEventListener('click', function(e){
        var target = e.target || e.srcElement;
        if (!!target && target.className.toLowerCase()==='user-delete') {               target.parentNode.parentNode.removeChild(target.parentNode);
        }
    })
}

new Contact();