账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    原生JavaScript DOM提供的自定义事件API和自己实现的发布订阅模式有啥区别?
    66
    0

    第一种方式:使用JavaScript原生提供的CustomEvent创建自定义事件
    比如可以这样创建:

    var evt = new CustomEvent(type, {detail: msg, bubbles: true, cancelable: true});

    然后监听并触发某个自定义事件

    element.addEventListener('longpress', longpressFn);
    element.dispatchEvent(evt);

    第二种方式:自己模拟一个自定义事件发布订阅对象

    var Event = (function() {
        var clientList = {};
        var listen,
            trigger,
            remove;
        listen = function(key, fn) {
            if (!clientList[key]) {
                clientList[key] = [];
            }
            clientList[key].push(fn);
        };
    
        trigger = function() {
            var key = [].shift.call(arguments);
            var fns = clientList[key];
    
            if (!fns || fns.length === 0) {
                return false;
            }
    
            for (var i = 0, fn; fn = fns[i++];) {
                fn.apply(this, arguments);
            }
        };
    
    
        remove = function(key, fn) {
            var fns = clientList[key];
    
            // key对应的消息没有被人订阅
            if (!fns) {
                return false;
            }
    
            // 没有传入fn(具体的回调函数), 表示取消key对应的所有订阅
            if (!fn) {
                fns && (fns.length = 0);
            }
            else {
                // 反向遍历
                for (var i = fns.length - 1,_fn=fns[i]; i >= 0; i--) {
                    if (_fn === fn) {
                        // 删除订阅回调函数
                        fns.splice(i, 1);
                    }
                }
            }
        };
    
        return {
            listen: listen,
            trigger: trigger,
            remove: remove
        }
    }());

    这两种方式都能实现一个自定义事件的创建、监听、触发、删除,但区别是第一种是原生DOM提供的API,第二种是用发布订阅模式去模拟的?原生DOM的创建方式也是一种发布订阅模式么?
    那在实际项目中用哪种比较好?查了下资料,发现用原生DOM的API貌似有IE方面的兼容问题
    现在一些大型的库或者框架都是用第二种那样自己实现的自定义事件订阅系统么?(主要最近在造自己的轮子,听说这种模式可以降低代码的耦合度,想学习下。。)

    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部