zoukankan      html  css  js  c++  java
  • 浅谈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返回事件的目标节点,即本应触发该事件的节点。需要做兼容处理

  • 相关阅读:
    四十一.redis主从复制 RDB/AOF持久化 数据类型
    四十.创建Redis集群 管理集群
    三十九.NoSQL概述 部署Redis服务 、 部署LNMP+Redis
    三十八. 分库分表概述 配置mycat
    520D
    442C
    LA4788
    LA3276
    LA4122
    zoj3478
  • 原文地址:https://www.cnblogs.com/adoctors/p/9221467.html
Copyright © 2011-2022 走看看