mobilemode.api.jump_wev8.js 10.4 KB
define("mApi/jump", ["mUtil"], function(mUtil) {
    var Mobilebone = require("mobilebone");
    var importCssText = function (id, cssText) {
        var style = document.getElementById(id + '.css');

        if (style) return (style.innerHTML = cssText);

        style = document.createElement('style');

        cssText += "\n/*# sourceURL=" + id + " */"; // 添加source URL 便于分清css来源
        style.appendChild(document.createTextNode(cssText));
        style.id = id + '.css';
        document.querySelector('head').appendChild(style);
    };

	return {
		backToHomepage: function(){
            var homepageid = mUtil.getHomepageId();
            var currentPageId = mUtil.getCurrentPageId();

            if(homepageid === currentPageId) return;

            var stack = require("pageStack");
            var pageids = stack.getAllPrevPageIds();
            var index = pageids.lastIndexOf(homepageid);
            var len = pageids.length;

            if (!len || index === -1) {
                return $u("/mobilemode/appHomepageView.jsp?appHomepageId=" + mUtil.getPageIntId(homepageid));
            }
            
            history.go(index - len);
        },
        createTopfloorPage: function(pageIdOrUrl, opts){
            var isPageid = !isNaN(pageIdOrUrl);
            var pageid = pageIdOrUrl;
            var def = {
                proportion : "70%", // 页面宽度或高度的占比
				effect : "1", //滑出效果 1:左滑出,2:左推出,3:右推出 4:由下而上滑出,5:由上而下滑出 6:右滑出
				maskBgColor : "rgba(0,0,0,0.2)", //遮罩层背景色
            };
            
            opts = $.extend({}, def, opts);

            if (!isPageid) {
            	pageid = mUtil.parseUrl(pageIdOrUrl)[3];
            }else{
            	pageIdOrUrl = "/mobilemode/appHomepageView.jsp?appHomepageId=" + pageid
            }

            if (!pageid || !~pageid) return;
           
            var $page_in =$("#page_" + pageid);
            var $page_out = $(".in." + Mobilebone.classPage);
            var form = "", cssText = "";
            var props = "width";
            
            if(!$page_in[0]) return Mobile_NS.msg("页面不存在");

            // 初始化动画的css
            (function (effect, ppr) {
                var _getAnimations = function(animations) {
                    return animations.reduce(function(prev, animate, index) {
                        return prev + "\
                            @keyframes " + animate.name + " {\
                                from { transform: translate3d("+animate.translateFrom.join(',')+"); }\
                                to { transform: translate3d("+animate.translateTo.join(",")+"); }\
                            }\
                        ";
                    }, "");
                };
                var _toPrecent = function(float) {
                    return Math.round( float * 100 ) + "%";
                };

				effect = parseInt(effect);
				
				// 支持传 px像素				
				if (!!~ppr.indexOf("px")) {
					ppr = ppr.replace("px", "");

					if (effect === 4 || effect === 5) {
						ppr = ppr / $page_out.height();
					} else {
						ppr = ppr / $page_out.width();
					}
				} else {
					ppr = ~ppr.indexOf("%") ? ppr.replace("%", "") / 100 : ppr;
				}
				
                switch (effect) {
                    case 1: // 左滑出,
                        form = "up_left";
                        cssText = _getAnimations([{
                            name: "slidepartupleftin",
                            translateFrom: ["-100%", 0, 0],
                            translateTo: [0,0,0]
                        }, {
                            name: "slidepartupleftout",
                            translateFrom: [0, 0, 0],
                            translateTo: ["-100%", 0, 0]
                        }]);
                        break;
                    case 2: // 左推出
                        form = "left";
                        cssText = _getAnimations([{
                            name: "slidepartleftin",
                            translateFrom: ["-100%", 0, 0],
                            translateTo: [0, 0, 0]
                        }, {
                            name: "slidepartleftout",
                            translateFrom: [0, 0, 0],
                            translateTo: ["-100%", 0, 0]
                        }, {
                            name: "slidenoopleftin",
                            translateFrom: [_toPrecent(ppr), 0, 0],
                            translateTo: [0, 0, 0]
                        }, {
                            name: "slidenoopleftout",
                            translateFrom: [0, 0, 0],
                            translateTo: [[_toPrecent(ppr), 0, 0]]
                        }]);
                        break;
                    case 3: //右推出
                        form = "right";
                        cssText = _getAnimations([{
                            name: "slidepartrightin",
                            translateFrom: [_toPrecent(1 / ppr), 0, 0],
                            translateTo: [_toPrecent(1 / ppr - 1), 0, 0]
                        }, {
                            name: "slidepartrightout",
                            translateFrom: [_toPrecent(1 / ppr - 1), 0, 0],
                            translateTo: [_toPrecent(1 / ppr), 0, 0]
                        }, {
                            name: "slidenooprightin",
                            translateFrom: ["-"+_toPrecent(ppr), 0, 0],
                            translateTo: [0, 0, 0]
                        }, {
                            name: "slidenooprightout",
                            translateFrom: [0, 0, 0],
                            translateTo: ["-"+_toPrecent(ppr), 0, 0]
                        }]);
                        break;
                    case 4:
                        form = "up";
                        props = "height";
                        cssText = _getAnimations([{
                            name: "slidepartupin",
                            translateFrom: [0, _toPrecent(1 / ppr), 0],
                            translateTo: [0, _toPrecent(1 / ppr - 1), 0]
                        }, {
                            name: "slidepartupout",
                            translateFrom: [0, _toPrecent(1 / ppr - 1), 0],
                            translateTo: [0, _toPrecent(1 / ppr), 0]
                        }]);
                        break;
                    case 5:
                        form = "down";
                        props = "height";
                        cssText = _getAnimations([{
                            name: "slidepartdownin",
                            translateFrom: [0, _toPrecent(-ppr), 0],
                            translateTo: [0, 0, 0]
                        }, {
                            name: "slidepartdownout",
                            translateFrom: [0, 0, 0],
                            translateTo: [0, _toPrecent(-ppr), 0]
                        }]);
                        break;
                    case 6: // 右滑出,
                        form = "up_right";
                        cssText = _getAnimations([{
                            name: "slidepartuprightin",
                            translateFrom: ['100%', 0, 0],
                            translateTo: [ 0,0,0]
                        }, {
                            name: "slidepartuprightout",
                            translateFrom: [0, 0, 0],
                            translateTo: ['100%', 0, 0]
                        }]) + " .page[data-form=slide_part_up_right]{left:"+_toPrecent(1-ppr)+"}";
                        break;
                }
            }(opts.effect, opts.proportion));
            cssText += "\
                @keyframes bgfadein {\
                    from { background: transparent; }\
                    to { background-color: " + opts.maskBgColor + "; }\
                }\
                @keyframes bgfadeout {\
                    from { background-color: " + opts.maskBgColor + "; }\
                    to { background-color: transparent; }\
                }";

            $page_in.attr("data-form", "slide_part_" + form);
            $page_out.attr({
                "data-form": "slide_noop_" + form,
                "data-mask": true
            });

            importCssText('custom_page_animation', cssText);
            $page_in[0].flagAniBind = false;
            $page_in[0].animationend = function(page, cls) {
                if(cls != "out") return;
                var clsNameOut = $page_out.attr("data-form");
                var clsNameIn = $page_in.attr("data-form");

                if (clsNameOut && clsNameIn && $('.in.' + Mobilebone.classPage)[0].id === $page_out[0].id) {
                    $page_out.removeAttr("data-form data-mask").removeClass(clsNameOut).off('click.back');
                    
                    if ($page_in.hasClass(clsNameIn)) {
                        $page_in.removeClass(clsNameOut);
                        $page_out.removeClass(clsNameOut);
                    }

                    $page_in.removeAttr("data-form").css(props, "100%");
                }
            };
			$page_in.css(props, opts.proportion);
            $page_out.one("click.back", function (e) {
                history.go(-1);
            });
            
            $u(pageIdOrUrl);
        },
        closeTopfloorPage: function(){
        	mUtil.back();
        },
        openUrlLeftReplace: function(url){
            $u(url, {
                replaceState: true,
                reverse: true
            });
        },
        openUrlRightReplace: function(url){
            $u(url, {
                replaceState: true
            });
        },
        openWebView: function(url, cfg){
            if(mUtil.checkEmpJsApi("openLink")){
                var config = {
                    url: url,
                    openType: 2, // 打开方式 1:当前窗口 2:新窗口 3:系统默认浏览器
                    sysId: window.__meta__.sysId
                };
                $.extend(config, cfg);
                mUtil.invokeEmApi("openLink", config);
            }else if(mUtil.runtime.isEmobile6()){
                var params = {url: url};
                if(cfg && cfg.title){
                    params.title = cfg.title;
                }
                location ='emobile:{"func": "openWindow","params": '+JSON.stringify(params)+'}';
            }else{
                top.location.href = url;
            }
        }
	};
});