mobilemode.api.event_wev8.js 1.77 KB
define("mApi/event", function () {
    var store = {};
    var evt = function (id) {
        if (id && store[id]) return store[id];

        var evts = {};

        store[id] = this;

        var _off = function (evtName, cb) {
            var e = evts[evtName];

            if (!e) return;

            if (cb) {
                var index = e.indexOf(cb);

                ~index && e.splice(index, 1);
            } else {
                delete evts[evtName];
            }

            if (!evts[evtName] || !evts[evtName].length) {
                e.ready = false;
            }

            return;
        };

        this.on = function (evtName, cb) {
            if (!evtName || !cb) return this;

            var e = evts[evtName] || [];

            if (e.ready) cb();

            evts[evtName] = e;
            evts[evtName].push(cb);

            return this;
        };
        this.off = function (evtName, cb) {
            // 传特定的evtName 会解绑相应的事件
            // 不传evtName 时 会解绑该页面中所有的事件
            if (!evtName && !cb) {
                return (evts = {});
            }

            var names = evtName.split(',');

            names.forEach(function (name) {
                _off(name.trim(), cb);
            });

            return this;
        };
        this.trigger = function (evtName) {
            var args = [].slice.call(arguments, 1);
            var e = evts[evtName];
            
            if (!e) {
                evts[evtName] = e = [];
            }

            e.ready = true;
            
            e.forEach(function (cb) {
                cb.apply(null, args);
            });

            return this;
        };
    };

    evt.getInstance = function (id) {
        return store[id];
    };

    return evt;
});