1234567891011 |
- /*!
- * SPA v1.0.7
- * A webapp framework for routing control and view transitions
- * Copyright 2015 zhaoda <http://zhaoda.net>
- * Licensed under MIT https://raw.github.com/zhaoda/spa/master/LICENSE
- *
- * update by wangyang
- * 封装为requirejs的模块,回调增加promise,不用的效果注释掉,减少文件大小
- */
- define(["zepto"],function(e){(function(e){"use strict";function D(e){return e=e||c.href,e.replace(/^[^#]*#?\/?(.*)\/?$/,"$1")}function I(e){return Object.prototype.toString.call(e)=="[object RegExp]"}function q(e){return e=e.replace(j,"\\$&").replace(P,"(?:$1)?").replace(H,function(e,t){return t?e:"([^/]+)"}).replace(B,"(.*?)"),"^"+e+"$"}function R(t,n){var r=t.exec(n).slice(1),i=[];return e.each(r,function(e,t){t&&i.push(decodeURIComponent(t))}),i}function U(e,t){var n=C[e.data("id")],r=C[t.data("id")];e.css({zIndex:w}),t.css({zIndex:E})}function K(t,n,r,i){var s=e(".spa-page-body",t),o=e(".spa-page-body",n),u={};!X&&(r="defaultInOut"),W[r]||(r="defaultInOut"),v&&(v=!1,r="defaultInOut",console.log("首次打开试图")),u.opacity=1,!J(r)&&X&&(u[X]="translate(0, 0) scale(1, 1)"),s.css(u),z[r].apply(t,[t,n,i])}function Y(e){event.stopPropagation(),event.preventDefault()}if(!e.os){var t={},n=navigator.userAgent,r=navigator.platform,i=n.match(/(Android);?[\s\/]+([\d.]+)?/),s=n.match(/(iPad).*OS\s([\d_]+)/),o=n.match(/(iPod)(.*OS\s([\d_]+))?/),u=!s&&n.match(/(iPhone\sOS)\s([\d_]+)/);i&&(t.android=!0,t.version=i[2]),u&&!o&&(t.ios=t.iphone=!0,t.version=u[2].replace(/_/g,".")),s&&(t.ios=t.ipad=!0,t.version=s[2].replace(/_/g,".")),o&&(t.ios=t.ipod=!0,t.version=o[3]?o[3].replace(/_/g,"."):null),e.os=t}var a=e(window),f=e(document),l,c=window.location,h=window.history,p=!1,d=!1,v=!0,m={},g={},y=[],b=2e3,w=2001,E=2002,S=0,x={},T={},N=[],C={},k,L,A,O="body {position: relative; margin: 0; padding: 0; width: 100%; overflow: hidden;} .spa-fullscreen {position: absolute; left: 0; top: 0; margin: 0; padding: 0; width: 100%; visibility: hidden; overflow: hidden; z-index: -1; } .spa-page {position: absolute; left: 0; top: 0; bottom: 0; right: 0; margin: 0; padding: 0; overflow: hidden; z-index: 2000; -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; -webkit-transform-style: preserve-3d;} .spa-page-bg {position: absolute; left: 0; top: 0; bottom: 0; right: 0; margin: 0; padding: 0; } .spa-page-body {position: absolute; left: 0; top: 0; bottom: 0; right: 0; margin: 0; padding: 0; overflow: hidden; -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; -webkit-transform-style: preserve-3d;} .spa-scroll {overflow: auto;} .spa-scroll-touch {-webkit-overflow-scrolling: touch; } .spa-scroll-x {overflow-y: hidden;} .spa-scroll-y {overflow-x: hidden;} .spa-cover {display: none; position: absolute; left: 0; right: 0; top: 0; bottom: 0; text-align: center; z-index: 5000; } .spa-loader {display: none; position: absolute; left: 0; right: 0; top: 0; bottom: 0; text-align: center; overflow: hidden; z-index: 5001; }",M='<div class="spa-loader-animate"><div class="bg"></div><span class="ball"></span><span class="ball"></span></div>',_=".spa-loader-animate {position: absolute; top: 50%; left: 50%;} .spa-loader-animate .bg {position: absolute; width: 64px; height: 64px; margin: 0 auto; top: -32px; left: -32px; border-radius: 50%; background: #2C3E50; opacity: 0.5;} .spa-loader-animate .ball {display: block; float: left; padding: 8px; margin-top: -8px; margin-left: -10px; -webkit-border-radius: 50%; -moz-border-radius: 50%; -ms-border-radius: 50%; -o-border-radius: 50%; border-radius: 50%;} .spa-loader-animate span:nth-child(2) {background: #16A085; -webkit-animation: move-left 800ms ease-in-out infinite alternate; -moz-animation: move-left 800ms ease-in-out infinite alternate; -ms-animation: move-left 800ms ease-in-out infinite alternate; -animation: move-left 800ms ease-in-out infinite alternate;} .spa-loader-animate .ball:nth-child(3) {background: #E67E22; -webkit-animation: move-right 800ms ease-in-out infinite alternate; -moz-animation: move-right 800ms ease-in-out infinite alternate; -ms-animation: move-right 800ms ease-in-out infinite alternate; animation: move-right 800ms ease-in-out infinite alternate;} @-webkit-keyframes move-left {to {-webkit-transform: translate(20px, 0); transform: translate(20px, 0); background: #e85932;}} @-webkit-keyframes move-right {to {-webkit-transform: translate(-20px, 0); transform: translate(-20px, 0); background: #44bbcc;}}";e.spa={},e.spa.getViewData=function(e){return C[e.data("id")]},e.spa.getCurPage=function(){return A},e.spa.version="1.0.7",f.on("spa:addstyle",function(t,n){e("head").append('<style type="text/css">'+n+"</style>")}),f.on("spa:scroll",function(t,n){var r=e(t.target),i=n&&n.direction||"";r.addClass("spa-scroll"+(i?" spa-scroll-"+i:""))}),f.on("spa:removescroll",function(t,n){var r=e(t.target);r.removeClass("spa-scroll")}),e.os.ios&&f.on("touchstart",".spa-scroll, .spa-scroll-x, .spa-scroll-y",function(t){var n=e(t.currentTarget),r=n.prop("scrollTop"),i=n.prop("scrollLeft"),s=n.height(),o=n.width(),u=n.prop("scrollHeight"),a=n.prop("scrollWidth");if(n.hasClass("spa-scroll")||n.hasClass("spa-scroll-x"))i<0,i<=0&&n.prop("scrollLeft",1),i+o>a,i+o>=a&&n.prop("scrollLeft",a-o-1);if(n.hasClass("spa-scroll")||n.hasClass("spa-scroll-y"))r<0,r<=0&&n.prop("scrollTop",1),r+s>u,r+s>=u&&n.prop("scrollTop",r-1)}),a.on("popstate",function(e){var t=D();f.trigger("spa:navigate",{hash:t,title:"",pushData:{},replace:!1})}),a.on("spapopstate",function(e,t){if(!p)return;var n=D();if(A&&A.hasClass("spa-panel")){var r=A.data("id"),i=C[r],s=i.prevPage;return s.trigger("spa:openpage"),!1}if(!y.length||y[y.length-1]!==n){y.push(n);var o=x[n],u=t&&t.pushData?t.pushData:{},a=t&&t.callback?t.callback:{};if(o){var l=o.data("id"),c=C[l];c.oldpushData=c.pushData,c.pushData=u,c.callback=a,o.trigger("spa:openpage")}else f.trigger("spa:createpage",{hash:n,pushData:u,callback:a})}});var P=/\((.*?)\)/g,H=/(\(\?)?:\w+/g,B=/\*\w+/g,j=/[\-{}\[\]+?.,\\\^$|#\s]/g,F={route:"",animate:"",classname:"",view:function(){return{title:"",body:""}},init:null,beforeopen:null,afteropen:null,beforeclose:null,afterclose:null};f.on("spa:route",function(t,n){var r=Array.prototype.slice.call(arguments,1);if(r.length>1)return e.each(r,function(e,t){f.trigger("spa:route",t)}),!1;var i=n.route||"";I(i)||(i=q(i)),n.animate&&!e.isFunction(n.animate)&&J(n.animate)&&(n.animate=""),m[i]=e.extend({},F,n)});var z={},W={},X,V,$;(function(){var e={"-webkit-transition":["-webkit-transform","webkitTransitionEnd"],"-moz-transition":["-moz-transform","transitionend"],"-ms-transition":["-ms-transform","msTransitionEnd"],"-o-transition":["-o-transform","oTransitionEnd"],transition:["transform","transitionend"]},t=document.createElement("div"),n;for(n in e)if(t.style[n]!==undefined){V=n,X=e[n][0],$=e[n][1];break}})(),e.fn.emulateTransition=function(t,n){var r=e(this);return requestAnimationFrame(function(){r.get(0).offsetWidth,t[V]="600ms",r.css(t).emulateTransitionEnd(function(){t={},t[V]="",r.css(t),n&&n()})}),r},e.fn.transition||(e.fn.transition=e.fn.emulateTransition),e.fn.emulateTransitionEnd=function(t,n){var r=!1,i=e(this),s;n=n||500,i.one($,function(){r=!0,clearTimeout(s),t.call(i)});var o=function(){r||i.trigger($)};return s=setTimeout(o,n),i},z.defaultInOut=function(e,t,n){U(t,e),n()},f.on("spa:addTransitPageAnimates",function(t,n){var r=[];e.each(n,function(e,t){r.push(e)}),e.each(r,function(e,t){e%2===0?W[t]=r[e+1]:W[t]=r[e-1]}),e.extend(z,n)}),f.trigger("spa:addTransitPageAnimates",{fadeIn:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={opacity:0},u={opacity:1};o.opacity=0,i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},fadeOut:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={opacity:0};s.emulateTransition(o,function(){U(n,t),r()})},slideInLeft:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={},u={};o[X]="translate(100%, 0)",u[X]="translate(0%, 0)",i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},slideOutRight:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={};o[X]="translate(100%, 0)",s.emulateTransition(o,function(){U(n,t),r()})},slideInRight:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={},u={};o[X]="translate(-100%, 0)",u[X]="translate(0%, 0)",i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},slideOutLeft:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={};o[X]="translate(-100%, 0)",s.emulateTransition(o,function(){U(n,t),r()})},slideInUp:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={},u={};o[X]="translate(0, 100%)",u[X]="translate(0, 0%)",i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},slideOutDown:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={};o[X]="translate(0, 100%)",s.emulateTransition(o,function(){U(n,t),r()})},slideInDown:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={},u={};o[X]="translate(0, -100%)",u[X]="translate(0, 0%)",i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},slideOutUp:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={};o[X]="translate(0, -100%)",s.emulateTransition(o,function(){U(n,t),r()})},pushInLeft:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=0,u={},a={},f={};u[X]="translate(100%, 0)",a[X]="translate(0%, 0)",f[X]="translate(-100%, 0)",i.css(u),U(n,t),i.emulateTransition(a,function(){++o==2&&r()}),s.emulateTransition(f,function(){++o==2&&r()})},pushOutRight:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=0,u={},a={},f={};u[X]="translate(-100%, 0)",a[X]="translate(0%, 0)",f[X]="translate(100%, 0)",i.css(u),U(n,t),i.emulateTransition(a,function(){++o==2&&r()}),s.emulateTransition(f,function(){++o==2&&r()})},pushInRight:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=0,u={},a={},f={};u[X]="translate(-100%, 0)",a[X]="translate(0%, 0)",f[X]="translate(100%, 0)",i.css(u),U(n,t),i.emulateTransition(a,function(){++o==2&&r()}),s.emulateTransition(f,function(){++o==2&&r()})},pushOutLeft:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=0,u={},a={},f={};u[X]="translate(100%, 0)",a[X]="translate(0%, 0)",f[X]="translate(-100%, 0)",i.css(u),U(n,t),i.emulateTransition(a,function(){++o==2&&r()}),s.emulateTransition(f,function(){++o==2&&r()})},zoomIn:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={},u={};o[X]="scale(0, 0)",u[X]="scale(1, 1)",i.css(o),U(n,t),i.emulateTransition(u,function(){r()})},zoomOut:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o={};o[X]="scale(0, 0)",s.emulateTransition(o,function(){U(n,t),r()})},overlayInUp:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=i.children().height(),u={top:"auto",height:o},a={};a[X]="translate(0, 0px)",i.css(u),o=o*2-i.prop("clientHeight"),u={height:o},u[X]="translate(0, "+o+"px)",i.css(u),U(n,t),i.emulateTransition(a,function(){r()})},overlayOutDown:function(t,n,r){var i=e(".spa-page-body",t),s=e(".spa-page-body",n),o=s.height(),u={},a={height:"auto",top:0};u[X]="translate(0, "+o+"px)",s.emulateTransition(u,function(){U(n,t),s.css(a),r()})}});var J=function(){var e=/^(overlay|reveal|pushPart).*$/;return function(t){return e.test(t)}}(),Q=function(){var e=0;return function(){return e++}}();f.on("spa:createpage",function(t,n){var r=n.hash,i=n.pushData,s=n.callback,o,u,a,l;e.each(m,function(e,t){a=new RegExp(e);if(a.test(r))return u=e,l=t,!1;a=!1});if(I(a)){var c=(l.classname?" spa-page-"+l.classname:"")+(l.nocache?" no-cache":""),h=e('<div class="spa-page'+c+'"><div class="spa-page-body"></div></div>'),p=Q(),d,v;h.data("id",p),d={id:p,hash:r,pushData:i,requestData:R(a,r),route:u,el:h,callback:s},C[p]=d,!l.nocache&&f.trigger("spa:viewcache",{view:h}),v=l.view.call(h,d),e.isPlainObject(v)&&f.trigger("spa:initpage",[h,v])}}),f.on("spa:initpage",function(t,n,r){var i=n.data("id"),s=C[i],o=m[s.route];e.each(["init","beforeopen","afteropen","beforeclose","afterclose"],function(e,t){r[t]&&(o[t]=r[t])}),s.viewData=r,e(".spa-page-body",n).html(r.body),l.append(n),e.Deferred(function(e){console.log("初始化面板是否成功"),n.data("spa:init")?e.resolve():(n.data("spa:init",!0),o.init?o.init.call(n,s,e):e.resolve())}).done(function(){n.trigger("spa:openpage")})}),f.on("spa:openpage",".spa-page",function(t,n){var r=e(t.currentTarget),i=r.data("id"),s=C[i],o=m[s.route],u=s.hash,c=s.pushData,h=s.oldpushData,p=s.requestData,v=s.viewData,y=c.title||v.title,E=!1,S=c.animate||o.animate;A||(l.append('<div class="spa-page spa-page-empty"><div class="spa-page-body"></div></div>'),A=e(".spa-page-empty"));var x=A.data("id"),T=C[x]||{};if(T.prevPage&&T.prevPage.data("id")===i){E=!0;if(!c.animate){var N=T.prevAnimate;N&&!e.isFunction(N)&&(S=W[N])}}var k,L;if(A.hasClass("spa-panel")){var O=g[A.data("id")];k=O.beforeclose,L=O.afterclose}else if(T.route){var M=m[T.route];k=M.beforeclose,L=M.afterclose}var _=function(){e.os.ios&&parseInt(e.os.version.slice(0,1))>5&&e(".spa-scroll",A).removeClass("spa-scroll-touch"),L&&L.call(A,T),A.hasClass("no-cache")&&A.remove(),A.hasClass("spa-panel")?(A.css({zIndex:b}),s.prevPage&&s.prevPage.css({zIndex:w})):E||(c.replacePage&&T.prevPage?(s.prevPage=T.prevPage,s.prevPage.css({zIndex:w}),A.css({zIndex:b})):s.prevPage=A),e.Deferred(function(t){e.isFunction(o.afteropen)?o.afteropen.call(r,s,t):t.resolve()}).done(function(){A=r,s.hash!==D()?(d=!1,a.trigger("spapopstate")):(e.isFunction(n)&&n.call(r),d=!1)})};e.Deferred(function(t){e.isFunction(k)?k.call(A,T,t):t.resolve()}).done(function(){e.Deferred(function(t){e.isFunction(o.beforeopen)?o.beforeopen.call(r,s,t):t.resolve()}).done(function(){!E&&(s.prevAnimate=S),e.os.ios&&parseInt(e.os.version.slice(0,1))>5&&e(".spa-scroll",r).addClass("spa-scroll-touch"),E||T.prevPage&&T.prevPage.css({zIndex:b}),e.isFunction(S)?S(r,A,_):K(r,A,S,_),f.trigger("spa:viewcachesort",{view:r})})})});var G={id:"",animate:"",classname:"",view:function(){return{body:""}},init:null,beforeopen:null,afteropen:null,beforeclose:null,afterclose:null};f.on("spa:panel",function(t,n){var r=Array.prototype.slice.call(arguments,1);if(r.length>1)return e.each(r,function(e,t){f.trigger("spa:panel",t)}),!1;n.id&&!g[n.id]&&(g[n.id]=e.extend({},G,n))}),f.on("spa:createpanel",function(t,n,r){var i=g[n];if(i){var s=i.classname?" spa-panel-"+i.classname:"",o=e('<div id="spa-panel-'+n+'" class="spa-page spa-panel '+s+'"><div class="spa-page-bg"></div><div class="spa-page-body"></div></div>'),u,a;o.data("id",n),u={id:n,pushData:r,el:o},C[n]=u,f.trigger("spa:viewcache",{view:o}),a=i.view.call(o,u),e.isPlainObject(a)&&o.trigger("spa:initpanel",[o,a])}}),f.on("spa:initpanel",function(t,n,r){var i=n.data("id"),s=C[i],o=s.pushData,u=g[i];e.each(["init","beforeopen","afteropen","beforeclose","afterclose"],function(e,t){r[t]&&(u[t]=r[t])}),s.viewData=r,e(".spa-page-body",n).html(r.body),l.append(n),e.Deferred(function(e){n.data("spa:init")?e.resolve():(n.data("spa:init",!0),u.init?u.init.call(n,s,e):e.resolve())}).done(function(){n.trigger("spa:openpanel",[i,o])})}),f.on("spa:openpanel",function(t,n,r){var i=T[n];r||(r={});if(i){if(d)return!1;d=!0;var s=g[n],o=r.animate||s.animate;if(A.hasClass("spa-panel")){var u=C[A.data("id")].prevPage;return u.trigger("spa:openpage",[function(){f.trigger("spa:openpanel",[n,r])}]),!1}var a=C[n];a.oldpushData=a.pushData,a.pushData=r;var l=function(){a.prevPage=A,e.Deferred(function(t){e.isFunction(s.afteropen)?s.afteropen.call(i,a,t):t.resolve()}).done(function(){A=i,d=!1})};e.Deferred(function(t){e.isFunction(s.beforeopen)?s.beforeopen.call(i,a,t):t.resolve()}).done(function(){a.prevAnimate=o,e.os.ios&&parseInt(e.os.version.slice(0,1))>5&&e(".spa-scroll",i).addClass("spa-scroll-touch");var t=A.data("id"),n=C[t]||{};n.prevPage&&n.prevPage.css({zIndex:b}),e.isFunction(o)?o(i,A,l):K(i,A,o,l),f.trigger("spa:viewcachesort",{view:i})})}else f.trigger("spa:createpanel",[n,r])}),f.on("spa:closepanel",function(t,n){var r=e(t.target),i=r.data("id"),s=C[i];n&&n.id&&(r=e(".spa-panel-"+n.id));if(A.hasClass("spa-panel")&&A.data("id")===i){var o=s.prevPage;o.trigger("spa:openpage")}}),f.on("touchstart",".spa-panel",function(t){var n=e(t.currentTarget),r=e(t.target);r.parent(".spa-page-body").length>0&&(t.stopPropagation(),t.preventDefault(),n.trigger("spa:closepanel"))}),f.on("spa:viewcachecount",function(e,t){S=t.count}),f.on("spa:viewcache",function(t,n){var r=n.view,i=r.data("id"),s,o;r.hasClass("spa-panel")?(s="panle",o=i,T[o]=r):(s="page",o=C[i].hash,x[o]=r),N.unshift(s+":"+o);if(S!==0&&N.length>S){var u=N.splice(S),a,f,l,c;e.each(u,function(t,n){a=n.split(":",2),f=a[0],l=a[1],c=f=="page"?x:T,e("img",c[l]).remove(),c[l].html("").remove(),delete c[l]})}}),f.on("spa:viewcachesort",function(e,t){var n=t.view,r=n.data("id"),i,s,o,u;n.hasClass("spa-panel")?(i="panle",s=r):(i="page",s=C[r].hash),o=i+":"+s,u=N.indexOf(o),u!==-1&&(N.splice(u,1),N.unshift(o))}),f.on("spa:navigate",function(e,t){var n=t.hash||"",r=t.title||"",i=t.pushData||{},s=t.replace||!1,o=t.callback||{},u=t.url||"";r&&(document.title=r),n=u+"#"+n;if(A&&!A.hasClass("spa-panel")&&y.length&&"#"+y[y.length-1]===n)return;if(d)return!1;d=!0,s?(i.replacePage=s,h.replaceState(i,r,n)):h.pushState(i,r,n),a.trigger("spapopstate",[t])}),f.on("spa:loader",function(e,t){t.body&&(M=t.body),t.style&&(_=t.style)});var Z;f.on("spa:openloader",function(e){L.show()}),f.on("spa:closeloader",function(e){L.hide()}),f.on("spa:boot",function(t,n){l=e("body"),k=e(".spa-fullscreen"),L=e(".spa-loader"),L.on("click select mousedown mousemove mouseup touchstart touchmove touchend",Y),n&&n.callback&&n.callback(),f.trigger("spa:closeloader"),p=!0,a.trigger("spapopstate"),n&&n.callback&&n.callback()})})(e),function(){"use strict";var e=0,t=["ms","moz","webkit","o"];for(var n=0;n<t.length&&!window.requestAnimationFrame;++n)window.requestAnimationFrame=window[t[n]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[n]+"CancelAnimationFrame"]||window[t[n]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t,n){var r=(new Date).getTime(),i=Math.max(0,16-(r-e)),s=window.setTimeout(function(){t(r+i)},i);return e=r+i,s}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(e){clearTimeout(e)})}()});
|