事件池 dom0 dom2

  • 设计模式

    • 发布订阅-观察者
      • 事件池 存放->按顺序执行
    • 模块模式
      • 闭包
    • 工厂模式
      • 无法区分关系
    • 构造函数模式
    • 混合模式(工厂 模块)
      • 定制化
    • 单例模式
      • 有且只有一个
  • JQ的发布订阅

    • .Callbacks()-回调函数集合(无去重处理) //JQ的事件池 letpond1=.Callbacks() //创建事件池('.submit').click(function(){
      spond1.fire(100); //执行事件池中的方法 传参 })pond1.add(func) //添加到事件池中的方法
      $pond1.remove(func) //移除事件池中的方法
  • DOM0和DOM2

    • 语法上的区别
      • dom0 box.onclick=function(){}
      • dom2 box.addEventListener('click',function(a,b,c){}) //a:事件名 click b:方法名 c:true-捕获阶段调用 false-冒泡阶段调用
    • 底层运行机制
      • dom0 元素某个属性绑定方法值 有效绑定的方法只有一个(后面替换之前的)
      • dom2 基于事件池机制完成,每增加一个绑定的方法,都会往事件池中存放一个 当事件触发会依次执行事件池中的事件(类似发布订阅模式 模拟事件池机制),可以给同一个元素的某个事件绑定多个不同的方法
    • dom2中可以给一些特殊的事件类型绑定方法,这些类型dom0不支持绑定,DOMContentLoaded(dom结构加载完成 触发执行事件)、transitioned(css3 过渡动画执行完成触发)
      • (document).ready() =>(function(){}) dom2 可以绑定多个
        • dom结构加载完成就执行
      • window.onload dom0 只能绑定一个 => dom2 window.addEventListener('onload',function(){})
        • dom树+所有相关资源均加载完毕才执行
    • dom2的事件池机制
      1. 基于addEventListener/attachEvent(IE6-8)向事件池追加方法、新版本浏览器会根据元素和事件类型对新增方法做重复校验,但是IE6-8不可以
      2. removeEventListener/dttachEvent删除事件 不能移除匿名函数
      3. 当事件行为触发,会把事件池中的方法按照增加的顺序执行,但IE6-8中执行的顺序是不固定的(乱序执行) 捕获 目标 冒泡
  • 事件池--数组塌陷

        let _subscribe=(function(){
            //发布订阅类subscribe
            class Sub(){
                constructor(){
                    //创建事件池 存储后期需要执行的方法
                    this.$pond = [];
                    
                    //向事件池中追加方法   func(需要追加的方法 判断是否是方法 去重)
                    add(func){ 
                        /*some
                            arr.some(item=>{
                                return item>1
                            })
                            找true
                            是否存在满足条件的 true   循环结束没有 false 不检测空数组,不改变原始数组) 
                        
                        every
                            找false
                            找到后终止并返回false 每个对象是否满足条件
                        
                        find
                            arr.find(item=>{
                                return item.flag
                            })   
                            返回找到的满足条件的第一项,停止循环 不改变原始数组 循环完毕没找到返回undefined,不检测空数组)
                        
                        
                        includes(arr.includes(1)  true/false) filter(筛选 返回新数组,不改变旧的) 
                        
                        map(映射 返回新数组,不改变旧的) 
                        */
                        let flag = this.$pond.some(item=>{
                            return item===func
                        })
                        if(!flag){
                            this.$pond.push(func)
                        }
                        // !flag ? this.$pond.push(func) : null;
                    }

                    //移除事件池中的方法
                    remove(func){
                        //splice filter  浅拷贝 堆内存 引用类型
                        let $pond=this.$pond;
                        for(let i=0;i<$pond.length;i++){
                            let item=$pond[i];
                            if(item===func){
                                //移除 不改变方法顺序(改变顺序 删除当前项 将最后一项添加到当前位置,然后删除最后一位--性能优化) splice(i,n)
                                $pond.splice(i,1);  //导致数组塌陷-->假移除 赋值为null
                                $pond[i]=null//解决数组塌陷 伪删除 保证索引
                                break;  
                                //终止循环 区别return(终止当次循环)  
                            }
                        }
                    }

                    //通知事件池中的方法依次执行
                    fire(...args){   //...扩展运算符   args  传进来所有参数的数组(不确定参数有几个)
                        let $pond=this.$pond
                        for(let i=0;i<$pond.length;i++){
                            let item=$pond[i]
                            if(typeOf item!=='function'){
                                $pond.splice(i,1);  //再进行删除
                                i--;
                                continue;//跳过循环体中剩下的语句                                 
                            }
                            item.call(this,...args)  //this指向当前实例   单独传参 在三个或以上参数时 call的性能略优与apply  --apply  数组传参
                        }
                    }
                }
            }
            return function subscribe(){  //暴露外界使用 做普通函数
                return new Sub()
            } 
        })();//闭包 防止污染 冲突

        let s1 = _subscribe(); //创建实例 事件池
        document.querySelector('.submit').onclick=function(event){
            let evt=event?event:window.event;    //cancelBubble  取消事件冒泡        stopPropagation  取消事件冒泡和下沉
            s1.fire(evt) //执行事件池中的方法执行
        }
        s1.add(func)
        s1.remove(func)
  • B站学习偶然看到的 up主-光影哔哩 珠峰培训课程
  • 之前的知识忘却大部分了 有错误的地方欢迎大佬联系我改正
  • 好久不学习了~ 咸鱼太久了啊
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • dom事件 1.什么是事件?事件就是一件事情或者行为(对于元素来说他的很多事件都是天生自带)只要我们去操作这个元素...
    田成力阅读 588评论 0 0
  • 22、JQ的基础语法、核心原理和项目实战 jQ的版本和下载 jQuery版本 1.x:兼容IE6-8,是目前PC端...
    萌妹撒阅读 1,740评论 0 0
  • 事件流分为两种,捕获事件流和冒泡时间流 捕获事件流:从根节点出发开始执行,一直往子节点查找执行,直到查到到根节点。...
    路上灵魂的自由者阅读 371评论 0 0
  • 什么是事件 事件分为两部分:1)行为本身:浏览器赋予的行为(本来就存在的):onclick、onmouseover...
    没了提心吊胆的稗子阅读 196评论 0 0
  • 声明:本文来源于http://www.webzsky.com/?p=731我只是在这里作为自己的学习笔记整理一下(...
    angryyan阅读 6,940评论 1 6