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>
原文地址:https://www.cnblogs.com/lisongy/p/4516226.html