app.js 10.6 KB
require.version = '0.0.9';
/**
 *
 */
define(
    "mk7/app",
    [
        'mk7/router',
        'mk7/utils',
        'mk7/url'
    ],
    function(router, utils, url) {

        var $$ = Dom7;

        var _app = {
            name : '',
            controllers : [],
            _options: {
                tapHold: !0,
                modalTitle: '',
                modalButtonOk: '确定',
                modalButtonCancel: '取消',
                modalPreloaderTitle : '正在加载...'
            },
            options : {},
            routes : {},
            baseUrl : '',
            init: function() {
                this.bindEvents();
                this.initMainView();
            },
            bindEvents: function() {
                window.onload = this.onDeviceReady()
            },
            onDeviceReady: function() {
                this.receivedEvent("deviceready")
            },
            receivedEvent: function(e) {
                switch (e) {
                    case "deviceready":
                        this.initMainView();
                        break;
                }
            },
            initMainView: function() {
                this.options = utils.extend(this._options, this.options);
                window.app = new mk7(this.options);
                window.mainView = app.addView(".view-main");
            },
            bootstrap: function(options){

                try {

                    options = utils.extend({baseUrl : ''}, options);

                    /**
                     * 定义各个模块
                     */
                    require.config({
                        urlArgs : "v=" + require.version,
                        paths: {
                            'mk7/accordion': "cmpts/accordion/accordion",
                            'mk7/autocomplete': "cmpts/autocomplete/autocomplete",
                            'mk7/calendar': "cmpts/calendar/calendar",
                            'mk7/forms': "cmpts/forms/forms",
                            'mk7/messages': "cmpts/messages/messages",
                            'mk7/modals': "cmpts/modals/modals",
                            'mk7/notifications': "cmpts/notifications/notifications",
                            'mk7/photo-browser': "cmpts/photo-browser/photo-browser",
                            'mk7/picker': "cmpts/picker/picker",
                            'mk7/progressbar': "cmpts/progressbar/progressbar",
                            'mk7/pull-to-refresh': "cmpts/pull-to-refresh/pull-to-refresh",
                            'mk7/push-state': "cmpts/push-state/push-state",
                            'mk7/scroll-toolbars': "cmpts/scroll-toolbars/scroll-toolbars",
                            'mk7/searchbar': "cmpts/searchbar/searchbar",
                            'mk7/slide-frame': "cmpts/slide-frame/slide-frame",
                            'mk7/smart-select': "cmpts/smart-select/smart-select",
                            'mk7/sortable': "cmpts/sortable/sortable",
                            'mk7/swipeout': "cmpts/swipeout/swipeout",
                            'mk7/swiper': "cmpts/swiper/swiper",
                            'mk7/tabs': "cmpts/tabs/tabs",
                            'mk7/virtual-list': "cmpts/virtual-list/virtual-list",
                            'mk7/jweixin': "https://res.wx.qq.com/open/js/jweixin-1.4.0",
                            'mk7/qqmap': "https://map.qq.com/api/js?v=2.exp&key=IJMBZ-MTWAS-XMYOM-6V3D5-HTR3Q-I7BI2",
                            "mk7/uploadjs":"cmpts/uploadjs/uploadjs",

                        },
                        shim: {
                            'mk7/accordion': {deps: [], exports: 'mk7/accordion'},
                            'mk7/autocomplete': {deps: [,'mk7/searchbar'], exports: 'mk7/autocomplete'},
                            'mk7/calendar': {deps: [,'mk7/modals'], exports: 'mk7/calendar'},
                            'mk7/forms': {deps: [], exports: 'mk7/forms'},
                            'mk7/messages': {deps: [], exports: 'mk7/messages'},
                            'mk7/modals': {deps: [], exports: 'mk7/modals'},
                            'mk7/notifications': {deps: [], exports: 'mk7/notifications'},
                            'mk7/photo-browser': {deps: [,'mk7/swiper'], exports: 'mk7/photo-browser'},
                            'mk7/picker': {deps: [,'mk7/modals'], exports: 'mk7/picker'},
                            'mk7/progressbar': {deps: [], exports: 'mk7/progressbar'},
                            'mk7/pull-to-refresh': {deps: [], exports: 'mk7/pull-to-refresh'},
                            'mk7/push-state': {deps: [], exports: 'mk7/push-state'},
                            'mk7/scroll-toolbars': {deps: [], exports: 'mk7/scroll-toolbars'},
                            'mk7/searchbar': {deps: [], exports: 'mk7/searchbar'},
                            'mk7/slide-frame': {deps: [], exports: 'mk7/slide-frame'},
                            'mk7/smart-select': {deps: [], exports: 'mk7/smart-select'},
                            'mk7/sortable': {deps: [], exports: 'mk7/sortable'},
                            'mk7/swiper': {deps: [], exports: 'mk7/swiper'},
                            'mk7/swipeout': {deps: [], exports: 'mk7/swipeout'},
                            'mk7/tabs': {deps: [], exports: 'mk7/tabs'},
                            'mk7/virtual-list': {deps: [], exports: 'mk7/virtual-list'},
                            'mk7/jweixin': {deps: [], exports: 'mk7/jweixin'},
                            'mk7/qqmap': {deps: [], exports: 'mk7/qqmap'},
                            'mk7/uploadjs':{deps:[],exports:'mk7/uploadjs'},

                        }
                    });

                    this.baseUrl = options.baseUrl;
                    url.base = this.baseUrl;

                    this.init();
                    this.preroute();
                    router.init(this.routes);
                } catch (e) {
                    console.log(e);
                }
            },
            preroute : function (){
                $$("body").on("touchstart", function(e) {
                    var t = $$(e.target),
                        n = t.parents(".page-content"),
                        r = t.parents(".picker-modal-inner"),
                        i = t.parents(".toolbar"),
                        o = t.parents(".modal"),
                        u, a, f;
                    //当这些元素全部不存在的时候,清除事件。
                    if (!n[0] && !r[0] && !i[0] && !o[0]){
                       // e.  ();
                    } else if (n[0] || r[0]) {
                        u = n[0] ? n[0] : r[0],
                            a = e.touches[0].pageY,
                            f = u.scrollTop,
                        f <= 0 && (u.scrollTop = 1),
                        f + u.offsetHeight >= u.scrollHeight && (u.scrollTop = u.scrollHeight - u.offsetHeight - 1);
                    }
                });
                var u = navigator.userAgent;
                var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //这个判断 是不是ios手机
                if(isiOS){
                    // iphone 有效
                    document.body.addEventListener('focusin', function(){
                        //软键盘弹出的事件处理
                    })
                    document.body.addEventListener('focusout', function(){
                        //软键盘收起的事件处理
                        window.scrollTo({top:0,left:0,behavior:"smooth"});
                    })
                } else {
                    //获取原窗口的高度
                    var originalHeight=document.documentElement.clientHeight ||document.body.clientHeight;
                    // android 有效
                    window.onresize=function(){
                        //键盘弹起与隐藏都会引起窗口的高度发生变化
                        var resizeHeight=document.documentElement.clientHeight || document.body.clientHeight;
                        if(resizeHeight-0 < originalHeight-0){
                            //当软键盘弹起,在此处操作
                        }else{
                            //当软键盘收起,在此处操作
                            window.scrollTo({top:0,left:0,behavior:"smooth"});
                        }
                    }
                }
            },
            runController : function (name, params) {

                var me = this;
                params = utils.extend({}, params);

                if(!this.name){
                    return;
                }

                // app name / controller name
                // 例如 user + / + index + -contrller
                var controllerClassName =  this.name + '/' + name + '-controller';
                console.log(controllerClassName);
                try {
                    require([controllerClassName], function(c){
                        c.params = params;
                        //me.addController(controllerClassName, c);
                        return me._runController(name, c);
                    });
                } catch (e) {
                    console.log(e);
                }

            },
            afterRunController : function (){},//抽象方法,子类实现
            _runController : function (name, c) {
                c.init(window.app);
                c.view = name;
                c.beforeRun();
                var h = c.run();
                c.afterRun();
                if(window.app){
                    window.app.init();
                }
                if(window.mainView){
                    window.app.initPage('.page');
                }
            },
            addController : function(name, object){
                var c = this.controllers;
                var is = false;
                for(var i=0; i < c.length; i++){
                    if(c[i].name == name ){
                        this.controllers[i] = {
                            name : name,
                            object : object
                        }
                        is = true;
                    }
                }
                if(false == is){
                    this.controllers.push({
                        name : name,
                        object : object
                    });
                }
            },
            getCachedController : function (name) {
                var c = this.controllers;
                for(var i=0; i < c.length; i++){
                    if(c[i].name == name ){
                        return c[i].object;
                    }
                }
                return false;
            }
        };

        return _app;
    }
);