设计模式之观察者模式 DOM0级和DOM2级封装

Posted yess

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式 DOM0级和DOM2级封装相关的知识,希望对你有一定的参考价值。

DEM0级:

   var Observer = (function() {
        /* 
            声明一个空对象,存储事件和触发事件
        */
        var obj = {};

        return {
            // 添加事件---事件名,事件处理程序
            add: function(name, fn) {
                // 将事件写入对象
                obj[name] = fn;
            },
            // 触发事件---事件名,参数
            trigger: function(name, args = []) {
                obj[name].apply(obj, args);
            }
        };
    })();
    // Observer 就是观察者, 接口暴露的对象
    module.exports = Observer;
});

DOM2级:

var Observer = (function() {
        /* 
            声明一个空对象,存储事件和触发事件
        */
        var obj = {};

        return {
            // 添加事件---事件名,事件处理程序
            add: function(name, fn) {
                // 将事件写入对象---- 存储事件使用数组
                // 判断事件是否存在
                if (obj[name]) {
                    // 存在
                    obj[name].push(fn);

                } else {
                    // 不存在
                    obj[name] = [fn];
                }
            },
            // 触发事件---事件名,参数
            trigger: function(name, args = []) {
                obj[name].forEach(function(value) {
                    value.apply(obj, args);
                });
              
            },
            // 取消事件
            off: function(name, fn) {
                if (arguments.length == 0) {
                    // 取消所有事件
                    obj = {};
                } else if (arguments.length == 1) {
                    // 取消指定名称的事件
                    obj[name] = [];
                } else if (arguments.length == 2) {
                    obj[name].forEach(function(value, index) {
                        if (value == fn) {
                            // 在数组中移除该值
                            obj[name].splice(index, 1);
                        }
                    });
                }

                console.log(obj);
            },
            // 一次性事件
            once: function(name, fn) {
                // 备份this
                var me = this;
                // 为了防止传入为函数体
                function demo() {
                    fn();
                    // 移除事件
                    me.off(name, demo);
                }
                // 添加事件
                this.add(name, demo);

            }
        };
    })();  

以上是关于设计模式之观察者模式 DOM0级和DOM2级封装的主要内容,如果未能解决你的问题,请参考以下文章

理解:javascript中DOM0,DOM2,DOM3级事件模型

DOM事件机制

DOM事件机制

js 事件模型详解

如何优雅的封装一个DOM事件库

跨浏览器之事件处理程序