zoukankan      html  css  js  c++  java
  • javascript自定义事件讲解

    自定义事件

    什么是自定义事件?

    自定义事件:这要是跟函数有关系,就是让函数能够具备事件的某些特性

    为什么要使用自定义事件?

    有利于多人协作开发代码,一同开发不冲突

    如何去挂载自定义事件与事件函数?

    1.事件绑定的好处是什么?

    首先要明确一点,自定义事件是由函数组成,也就是函数调用。先来简单了解事件绑定。
    html代码

    <div id="div1">
        div
    </div>
    <span id="span1">span</span>
    

    简单的事件绑定函数

     function bind(obj,events,fn){
     //如果支持obj.addEventListener(标准浏览器支持)执行,如果不支持执行obj.attachEvent(IE低版本)
       if(obj.addEventListener){
                            obj.addEventListener(events,fn,false);
                }else{
                      obj.attachEvent('on'+events,function(){
                      //在IE低版本中函数指向会指向window,使用 call来修正指向
                        fn.call(obj);
                })
       }
    }
    
     window.onload=function(){
                var oDiv=document.getElementById('div1');
                bind(oDiv,'click',function(){
                    alert('1');
                });//1
                bind(oDiv,'click',function(){
                    alert('2');
                });//2
    
            };
    

    结果中1/2会同时出现,这是事件绑定,但这需要事件进行触发才能进行,但我们所想的是不用事件便可以达到事件绑定的效果,其实无非是执行封装函数中的fn方法,想到这里,每一个fn对应一个events,对应一个obj,我们把obj比作一座楼的楼层,而events比作书架,而fn就是对应的书,我们想的是如果将书放到指定楼层的指定书架上就行了。由此为了得到方法的集合,我们需要重写bind封装方法

    function bind(obj,events,fn){
                //obj;楼层
                //events:书架
                //fn:一本书
                // 如果没有 创建楼层 ,通过对象添加属性
                obj.listeners = obj.listeners || {};
                //如果没有 创建书架 通过数组添加函数
                obj.listeners[events]=obj.listeners[events] || [];
                //放入书
                obj.listeners[events].push(fn);
                if(obj.addEventListener){
                    obj.addEventListener(events,fn,false);
                }else{
                    obj.attachEvent('on'+events,function(){
                        fn.call(obj);
                    })
                }
            }
    

    现在我们将fn的方法集合存储在了obj.listeners[events]中,下一步我们要做的是如何调用执行里面的每一个函数

    var oSpan=document.getElementById('span1');
    bind(oSpan,'show',function(){
                    alert('3');
                });
    bind(oSpan,'show',function(){
                    alert('4');
                });
    //函数调用
    fireEvent(oSpan,'show');
    //主动触发自定义事件
           function fireEvent(obj, events) {
                //判断如果obj.listeners以及obj.listeners[events]存在
                if(obj.listeners && obj.listeners[events]){
                    for (var i = 0; i < obj.listeners[events].length; i++) {
                        //函数执行
                        obj.listeners[events][i]();
                    }
                }
                
    
            }
    

    由于本人水平有限只理解到这个程度,有什么理解不到位的请大家指正,下面贴完整代码


    <!doctype html>
    <html lang="zh_EN">
    <head>
        <meta charset="UTF-8">
        <title>自定义事件</title>
        <script>
            window.onload = function () {
                var oDiv = document.getElementById('div1');
                var oSpan = document.getElementById('span1');
                bind(oDiv, 'click', function () {
                    alert('1');
                });
                bind(oDiv, 'click', function () {
                    alert('2');
                });
    
    
                bind(oSpan, 'show', function () {
                    alert('3');
                });
                bind(oSpan, 'show', function () {
                    alert('4');
                });
                fireEvent(oSpan, 'show');
    
            };
    
    
            //绑定事件
            function bind(obj, events, fn) {
                //obj;楼层
                //events:书架
                //fn:一本书
                //创建楼层
                obj.listeners = obj.listeners || {};
                //创建书架
                obj.listeners[events] = obj.listeners[events] || [];
                //放入书
                obj.listeners[events].push(fn);
                if (obj.addEventListener) {
                    obj.addEventListener(events, fn, false);
                } else {
                    obj.attachEvent('on' + events, function () {
                        fn.call(obj);
                    })
                }
            }
            //主动触发自定义事件
            function fireEvent(obj, events) {
                for (var i = 0; i < obj.listeners[events].length; i++) {
                    //函数执行
                    obj.listeners[events][i]();
                }
    
            }
        </script>
    </head>
    <body>
    <div id="div1">
        div
    </div>
    <span id="span1">span</span>
    </body>
    </html>
    
  • 相关阅读:
    封装小程序http请求
    ES6为数组做的扩展
    练习题
    二叉树的遍历
    快速搭建vue项目
    收集的前端面试大全
    ios兼容webp格式的图片
    小程序开发API之获取启动参数
    使用HTML编写邮件
    深入理解javascript原型和闭包(9)——this
  • 原文地址:https://www.cnblogs.com/lisongy/p/4516226.html
Copyright © 2011-2022 走看看