浅谈JavaScript--事件委托与事件监听

事件监听

该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄。

即可以向同一个元素添加同一个事件多次。

添加事件

语法:
element.addEventListener(event,function,useCapture);

  • event:事件的类型。如'click','mousedown'等。谷歌浏览器下不用加'on'前缀。
  • function:事件触发时调用的函数。
  • useCapture:布尔类型,用于描述事件时冒泡还是捕获,可选。默认false,即冒泡传递。
<div id="box"></div>

<script>
var box = document.getElementById('box');
box.onclick = function() {
    alert('box');
}
box.onclick = function() {
    alert('box2!');
}
</script>

此时后面的事件会覆盖前面的事件,即点击box时只弹出'box2!'

事件监听写法:

<div id="box"></div>

<script>
var box = document.getElementById('box');
box.addEventListener('click', function() {
    alert('box');
})
box.addEventListener('click', function() {
    alert('box2');
})
</script>

此时即点击box,先弹出'box',接着弹出'box2!'。

移除事件

语法:
element.removeEventListener(event,functionName);

移除由addEventListener()方法添加的事件,移除与添加的必须为同一个函数。

兼容性

在ie8及更早版本不支持以上方法

请使用:

element.attachEvent(event,function);        //添加
element.detachEvent(event,function);        //删除

注意给事件加'on'前缀。

跨浏览器解决方案

function addEventListener(obj,eve,fun){
    if(obj.addEventListener){
        obj.addEventListener(eve,fun);
    }else if(obj.attachEvent){
        eve="on"+eve;
        obj.attachEvent(eve,fun);
    }else{
        obj['on'+eve]=fun;
    }
}

事件委托

情景:前期绑定了事件,后期有添加了节点,而新添加的节点却没有相应的事件。用事件委托解决。

通常事件是直接添加在触发的元素上,事件委托则是吧事件委托给该元素的父级。

原理:利用冒泡原理,把事件添加到父级上,触发执行效果。

<div id="box">
    <p>我是原来的节点1</p>
    <p>我是原来的节点2</p>
</div>

<script>
var box = document.getElementById('box');
var p = document.getElementsByTagName('p');

var child3 = document.createElement('p');
child3.innerHTML = '我是新添加的节点3';
box.appendChild(child3);

for (var i = 0; i < p.length; i++) {
    p[i].onclick = function() {
        console.log(this.innerHTML)
    }
}

var child4 = document.createElement('p');
child4.innerHTML = '我是新添加的节点4';
box.appendChild(child4);
</script>

此时点击box下的所有p元素,前3个都可以获取到innerHTML,第4个却不能

用事件委托的方法去写:

<div id="box">
    <p>我是原来的节点1</p>
    <p>我是原来的节点2</p>
</div>

<script>
var box = document.getElementById('box');
var p = document.getElementsByTagName('p');

var child3 = document.createElement('p');
child3.innerHTML = '我是新添加的节点3';
box.appendChild(child3);
//----------------区别分割线----------------------------
box.onclick = function(e) {             //委托给父级
    var e = e || window.event;          //兼容处理
    var target = e.target || e.srcElement;      //兼容处理
    if (target.nodeName.toLowerCase() == 'p') {     //触发事件的目标节点
        console.log(target.innerHTML);
    }
}
//----------------区别结束------------------------------
var child4 = document.createElement('p');
child4.innerHTML = '我是新添加的节点4';
box.appendChild(child4);
</script>

此时点击box下的所有p元素,都可以获取到innerHTML。

上述方法中target返回事件的目标节点,即本应触发该事件的节点。需要做兼容处理

posted @ 2018-06-24 19:30  adoctors  阅读(146)  评论(0编辑  收藏  举报