小微型库(3.绑定on和解绑off)

小微型库(3.绑定on和解绑off)小微型库(3.绑定on和解绑off)

大家好,又见面了,我是你们的朋友全栈君。

on绑定

$(“div”).on(“click mouseenter click.Liang”, function(){});

off解绑

$(“div”).off();

$(“div”).off(“click.sjl”);

//对于_addEventFn(){}函数的解释
//events属性是以下的格式
    div.events = {
        click : {
            sjl : function(){
                console.log();
            },
            yl : function(){

            },
            anonymous : [fn, fn, fn]  //存放没有自定义名字的事件函数值
        },
        mouseenter : {
            anonymous : [fn, fn, fn],
            sjl : function(){
                
            },
            yl : function(){
                
            }
        },
    }
复制代码
//阻止默认行为的兼容
if(!Event.prototype.preventDefault){
    Event.prototype.preventDefault = function(){
        window.event.returnValue = false;
    };
}
//阻止冒泡的兼容
if(!Event.prototype.stopPropagation){
    Event.prototype.stopPropagation = function{
        window.event.cancelBubble = true;
    };
}
//将添加到dom身上的事件函数存储起来的方法
    function _addEventFn(data){
    //dom:节点  type:事件数组  fn:事件函数
    //之前从来没绑定过任何事件,把它变成一个对象
    if(typeof data.dom.events === "undefined"){
        data.dom.events = {};
    }
    //之前没有绑定过相同类型的事件
    if(typeof data.dom.events[data.type[0]] === "undefined"){
        data.dom.events[data.type[0]] = {};
        data.dom.events[data.type[0]].anonymous = [];
        //anonymous是一个数组,存放匿名函数
    }
    //type是数组,类似["mouseenter", "sjl"] 或者["click"]
    //判断有没有自定义事件的名字  存事件函数
    if(data.type[1] === undefined){
        //如果为undefined,说明是匿名函数,存放到anonymous属性对应的数组中
        data.dom.events[data.type[0]].anonymous.push(data.fn);
    }else{
        data.dom.events[data.type[0]][data.type[1]] = data.fn;
        // data.dom.events[data.type[0]]代表事件 例如click
    }
    }

 //兼容removeEventListener
    function _removeEvent(dom, type, fn, bool){
        //v, key1, v.events[key1].anonymous[j], false
        if(dom.removeEventListener){
            //主流
            dom.removeEventListener(type, fn, !!bool);
        }else{
            //ie
            dom.detachEvent("on"+type, fn);
        }
     }
//原型里的方法
Liang.prototype = function(){
    constructor : Liang,
    init : function(){}, //(1)
    html : function(){}, //(2)
    //事件绑定
    on : function(eventType, fn){
        //非字符串不做操作
        if(typeof eventType !== "string") return;
        var arr = eventType.trim().split(/\s+/);
        for(var i = 0, len = this.length; i < len; i++){
            (function(i, that){
               //that当前jq对象中的元素
                for(var j = 0, len = var.lenght; j < len; j++ ){
                    var type = arr[j].split(/\./),
                        eventFnName = null;
                    if(type[0] === "mousewheel"){
                        //需要判断火狐及其他浏览器的事件
                        function _eventWheelFn(e){
                            var dir = e.wheelDelta / 120 || -e.detail / 3;
                            fn.call(that, e, dir) === false && e.preventDefault();
                        }
                        type[0] = (that.onmousewheel === null) ? "mousewheel" : "DOMMouseScroll";
                        eventFnName = _eventWheelFn;
                    }else{
                        function _eventFn(e){
                            e = e || window.event;
                            fn.call(that, e) === false && e.preventDefault;
                        }
                        eventFnName = _eventFn;
                    }
                    that.addEventListener ? 
                    that.addEventListener(type[0], eventFnName, false) :
                    that.attachEvent("on"+type[0], eventFnName);
                    
                    //存储对应事件函数
                    _addEventFn({
                        dom : that,
                        type : type,
                        fn : eventFnName
                    });
                }
            }(i, this[i]))
        }
        return this;
    },
    //事件解绑
    off : function(){
        if(typeof eventType === "undefined"){
            //解绑所有事件
            Liang.each(this, function(v){
                // v 当前进来的元素
                for(var key1 in v.events){
                    // key1 是事件类型的名字 例如 click mouseenter
                    for(var key2 in v.events[key1]){
                        // key2 是事件类型对象中自定义的名字 例如 sjl
                        if(Liang.type(v.events[key1][key2]) === "function"){
                        //给自定义名字的事件解绑函数
                            _removeEvent(v, key1, v.events[key1][key2],false);
                        }else{
                            //给anonymous数组中的函数解绑
                            var len = v.events[key1].anonymous.length;
                            for(var j = 0; j < len; j++){
                              //解绑anonymous数组内的函数
                              _removeEvent(v, key1, v.events[key1].anonymous[j], false);
                            }
                        }
                    }
                }
                v.events = {}; //清空events里所有数据
            });
        }else if(typeof eventType === "string"){ //例如 "click.yl mouseenter.sjl"
            var arr = eventType.trim().split(/\s+/); //["click.yl", "mouseenter.sjl"]
            //判断输入的为[""],则不作操作
            if(arr.toString() === "") return this;
            //对事件名数组的遍历
            for(var i = 0, len = arr.length; i < len; i++){
                var type = arr[i].split(/\./); //["click","yl"],["mouseenter","sjl"] 
                //遍历实例对象,取到元素,解绑元素身上对应的事件
                Liang.each(this, function(v){
                    //判断是否火狐,修改对应的事件名
                    if(type[0] === "mousewheel"){
                        //判断滚动事件是否在火狐或者主流浏览器执行
                        type[0] = (v.onmousewheel === null) ? "mousewheel" : "DOMMouseScroll";
                    }
                    if(type.length > 1){
                        //解绑自定义名的事件函数
                        _removeEvent(v, type[0], v.events[type[0]][type[1]], false);
                        delete v.events[type[0]][type[1]];
                    }else{
                        //解绑同类型事件
                        //解绑对应事件的所有匿名事件 例如$("div").off("click")
                        for(var j = 0, len = v.events[type[0]].anonymous.length; j < len; j++){
                            _removeEvent(v, type[0], v.events[type[0]].anonymous[j], false);
                        }
                        //解绑该事件类型中有名的 例如$("div").off("click.yl")
                        for(var k in v.events[type[0]]){
                            // k是自定义属性名 sjl yl  //判断在不在数组的原型上.false则表示不在,说明是function,取反
                            if(!(v.events[type[0]][k] instanceof Array)){
                                //自定义名字的事件属性值
                                _removeEvent(v, type[0], v.events[type[0]][k], false);
                            }
                        }
                        delete v.events[type[0]];
                    }
                });
            }
        }
    },
 }

复制代码

转载于:https://juejin.im/post/5bdbf8ef51882516f5784bbc

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107212.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月20日 下午10:00
下一篇 2022年4月20日 下午10:00


相关推荐

  • pycharm删除文件后怎样找回

    pycharm删除文件后怎样找回1 打开 pycharm 后 点击项目文件夹右键 2 在弹出的菜单中 点击 LocalHistory 会自动出现子菜单 点击 showhistoy 功能 3 弹出本地历史窗口后 左侧显示删除的文件列表及信息 文件名及删除时间 4 选中需要找回的文件后 点击右键 选择 Revertselect

    2026年3月19日
    1
  • 浅议大数据时代下消防工作、生活和思维的变革「建议收藏」

    浅议大数据时代下消防工作、生活和思维的变革「建议收藏」最近在微信圈流行的段子:一个客户拨打了披萨店的电话,还没说要什么披萨,仅仅告知了他的会员卡号,店员从系统中就知道了他所有个人信息。包括地址、电话、身高体重、医疗记录、过敏史、家里几口人、家里人的健康状态、房贷、个人信用,最后还包括他现在骑着摩托车拨打电话的GPS定位。并针对他目前这些信息定向推销店内减肥的、低糖的、够他家庭6人份的披萨,还指出他最好用现金…

    2022年7月16日
    23
  • 磁盘管理无法连接虚拟磁盘服务_diskpart虚拟磁盘服务错误

    磁盘管理无法连接虚拟磁盘服务_diskpart虚拟磁盘服务错误满意答案在ParallelsDesktop中,将新的空白虚拟硬盘添加到虚拟机配置后,对于安装在虚拟机中的操作系统来说它将不可见,直至将其初始化。初始化Windows中的新虚拟硬盘要初始化Windows虚拟机操作系统中的新虚拟硬盘,需要可用的磁盘管理工具。例如,在Windows7和WindowsXP中可以通过以下步骤访问该工具:·在Windows7中,点击“开始”>“控制面板”&…

    2026年2月9日
    4
  • 一键生成惊雷等喊麦歌词

    一键生成惊雷等喊麦歌词思路写一下 1 给一长篇的小说 利用正则表达式将小说分为无数的字符串 2 将从后到前字符串切割 最长为 n 否则一句话太长 3 并且将每一个字符串的末尾音节提取出来 普通的韵脚音的话放在一个字符数组里面 3 增加一个 hashmap 表 添加平时用的韵脚 4 将符合 hashmap 的韵脚放在字典里 5 规定歌词的格式 比如 随机从字典取出字

    2025年6月5日
    4
  • Python入门教程 超详细1小时学会Python

    Python入门教程 超详细1小时学会Python为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.思路:用shell编程.(Linux通常是ba

    2022年7月3日
    27
  • 简单易懂的softmax交叉熵损失函数求导

    简单易懂的softmax交叉熵损失函数求导来写一个softmax求导的推导过程,不仅可以给自己理清思路,还可以造福大众,岂不美哉~softmax经常被添加在分类任务的神经网络中的输出层,神经网络的反向传播中关键的步骤就是求导,从这个过程也可以更深刻地理解反向传播的过程,还可以对梯度传播的问题有更多的思考。softmax函数softmax(柔性最大值)函数,一般在神经网络中,softmax可以作为分类任务的输出层。其实可…

    2022年6月26日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号