• JS——事件的绑定与解绑


    1、绑定形式

    ele.addEventListener(evtName, fn)
    ele["on" + evtName] = function () {}
    ele.onclick = function () {}

    2、addEventListener:事件监听器。 原事件被执行的时候,后面绑定的事件照样被执行,不会被层叠掉

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <button>绑定事件</button>
    <script>
        var btnEle = document.getElementsByTagName("button")[0];
        bindEvt2(btnEle, "click", fn1);
        bindEvt2(btnEle, "click", fn2);
    
        function fn1() {
            console.log("你是美丽的人");
        }
    
        function fn2() {
            console.log("你是个坏人");
        }
        
        function bindEvt2(ele, evtName, fn) {
            ele.addEventListener(evtName, fn);
        }
    </script>
    </body>
    </html>
    //九尺龙泉万卷书,上天生我意何如。
    //不能报国平天下,枉为男儿大丈夫。

    注意事项:ele["on" + evtName]与ele.onclick绑定的方式会层叠到之前的事件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <button>点击</button>
    <script>
        var btn=document.getElementsByTagName("button")[0];
        btn.onclick=function () {
            console.log("你是美人");
        }
        btn["onclick"]=function () {
            console.log("谢谢呀");
        }
    </script>
    </body>
    </html>
    //谢谢呀

    3、addEventListener原理:之所以可以不层叠之前注册事件,主要是判断之前是否注册了此类事件,如果注册了就先执行此事件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <button>点击</button>
    <script>
        var btn = document.getElementsByTagName("button")[0];
        btn.onclick = function () {
            console.log("你是美人");
        }
        addEvent(btn, "click", fn);
    
        function addEvent(ele, evtName, fn) {
            var oldEvnet = ele["on" + evtName];//如果进入绑定事件本身,那么该事件已经本绑定了,所以获取旧的事件必须在新的事件绑定之前
            ele["on" + evtName] = function () {
                //如果没有被定义过事件该事件源的该事件属性应该是null对应的boolean值是false
                //如果已经定义过事件该事件源的该事件属性应该是function本身对应的boolean值是true
                if (oldEvnet) {
                    oldEvnet();//因为oldEvent本身他就是函数本身,那么后面加一个();就是执行函数
                    fn();
                }
                else {
                    fn();
                }
            }
        }
    
        function fn() {
            console.log("谢谢呀")
        }
    </script>
    </body>
    </html>
    //你是美人
    //谢谢呀

    4、事件绑定的兼容写法

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <button>赋诗</button>
    <script>
        var btn = document.getElementsByTagName("button")[0];
    
    //    火狐谷歌IE9+支持addEventListener
    //    btn.addEventListener("click",fn1);
    //    btn.addEventListener("click",fn2);
    
    //    IE678支持attachEvent
    //    btn.attachEvent("onclick",fn1);
    //    btn.attachEvent("onclick",fn2);
    
        //兼容写法
        EventListen = {
            addEvent: function (ele,fn,str) {
                //通过判断调用的方式兼容IE678
                //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法
                if(ele.addEventListener){
                    //直接调用
                    ele.addEventListener(str,fn);
                }else if(ele.attachEvent){
                    ele.attachEvent("on"+str,fn);
                }else{
                    //在addEventListener和attachEvent都不存在的情况下,用此代码
                    ele["on"+str] = fn;
                }
            }
        }
    
        EventListen.addEvent(btn,fn1,"click")
        EventListen.addEvent(btn,fn2,"click")
    
        function fn1(){
            console.log("九尺龙泉万卷书,上天生我意何如。");
        }
        function fn2(){
            console.log("不能报国平天下,枉为男儿大丈夫。");
        }
    
    </script>
    </body>
    </html>
    //九尺龙泉万卷书,上天生我意何如。
    //不能报国平天下,枉为男儿大丈夫。

    5、事件解绑方式

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <button>点击</button>
    <script>
        var btn = document.getElementsByTagName("button")[0];
        btn.onclick = function () {
            console.log("你是美人");
        }
        btn.onclick = null;
    </script>
    </body>
    </html>
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <button>赋诗</button>
    <script>
        var btn = document.getElementsByTagName("button")[0];
        EventListen = {
            addEvent: function (ele, fn, str) {
                //通过判断调用的方式兼容IE678
                //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法
                if (ele.addEventListener) {
                    //直接调用
                    ele.addEventListener(str, fn);
                } else if (ele.attachEvent) {
                    ele.attachEvent("on" + str, fn);
                } else {
                    //在addEventListener和attachEvent都不存在的情况下,用此代码
                    ele["on" + str] = fn;
                }
            },
            removeEvent: function (ele, fn, str) {
                if (ele.removeEventListener) {
                    ele.removeEventListener(str, fn);
                } else if (ele.detachEvent) {
                    ele.detachEvent("on" + str, fn);
                } else {
                    ele["on" + str] = null;
                }
            }
        }
        EventListen.addEvent(btn, fn, "click");
        EventListen.removeEvent(btn, fn, "click");
    
        function fn() {
            alert(1);
        }
    </script>
    </body>
    </html>

    注意事项:ele.onclick只能用ele.onclick=null,removeEvent只能解绑addEventListener,detachEvent只能解绑attachEvent。

  • 相关阅读:
    进程实际操作篇2
    进程的实际操作篇1
    进程的理论知识
    解决套接字粘包,udp套接字对象的使用和socketserver模块实现并发
    day24-网络知识扫盲,socket的基本使用
    day23-网络编程之互联网基础,tcp/ip协议详细介绍
    day21-多态和多态性,鸭子类型,反射,内置方法,异常处理
    JAVA WEB小测
    JAVA动手动脑
    JAVA课上动手动脑问题2
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7919509.html
Copyright © 2020-2023  润新知