事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。
我们有下面的一个场景:当点击li输出相应的值
1 2 3 4 5 6 7 | <ul class="list-item"> <li class="item">1</li> <li class="item">2</li> <li class="item">3</li> <li class="item">4</li> </ul> |
我们可以这样写
1 2 3 4 5 6 7 8 | var itemDom = document.getElementByClass("item") for(var i=0, l = itemDom.length; i < l; i++){ this.addEventListener("click",function{ //TODO }); } |
其实这里面就有一个问题,如果li少的话都还行,如果有成千上万条的话就非常的占用性能
我们根据dom的冒泡性质可以这样修改,将事件绑定在ul上,并通过e.target去处理目标节点
1 2 3 4 5 6 7 8 9 10 11 12 13 | document.getElementsByClassName("list-item")[0].addEventListener("click",function(e) { // 检查事件源e.targe是否为Li if(e.target && e.target.nodeName == "LI") { console.log(e.target.innerText) } }); //juqery $('.list-item').on('click', '.item', function() { alert($(this).text()) }) |
在ie下面我们要使用e.srcElement来获取事件源,srcElement.tagName能够捕获活动标记名称