| |
| //>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude); |
| //>>description: Animated page change core logic and sequence handlers |
| //>>label: Transition Core |
| //>>group: Transitions |
| //>>css.structure: ../css/structure/jquery.mobile.transition.css |
| //>>css.theme: ../css/themes/default/jquery.mobile.theme.css |
| |
| define( [ "jquery", "./jquery.mobile.core" ], function( jQuery ) { |
| //>>excludeEnd("jqmBuildExclude"); |
| (function( $, window, undefined ) { |
| |
| var createHandler = function( sequential ) { |
| |
| // Default to sequential |
| if ( sequential === undefined ) { |
| sequential = true; |
| } |
| |
| return function( name, reverse, $to, $from ) { |
| |
| var deferred = new $.Deferred(), |
| reverseClass = reverse ? " reverse" : "", |
| active = $.mobile.urlHistory.getActive(), |
| toScroll = active.lastScroll || $.mobile.defaultHomeScroll, |
| screenHeight = $.mobile.getScreenHeight(), |
| maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $.mobile.$window.width() > $.mobile.maxTransitionWidth, |
| none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none" || Math.max( $.mobile.$window.scrollTop(), toScroll ) > $.mobile.getMaxScrollForTransition(), |
| toPreClass = " ui-page-pre-in", |
| toggleViewportClass = function() { |
| $.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name ); |
| }, |
| scrollPage = function() { |
| // Prevent blinking on page scrolling in Tizen/Android devices. |
| // Don't scoll window, when current scroll top(scrollTop()) is already at toScroll, |
| // or when current scroll top is 0 and toScroll is same to defaultHomeScroll |
| // (which means the top position of page). In these case, page scrolling is not needed. |
| var st = $.mobile.$window.scrollTop(); |
| if( st === toScroll || ( $.mobile.defaultHomeScroll === toScroll && st == 0 ) ) { |
| return; |
| } |
| |
| // By using scrollTo instead of silentScroll, we can keep things better in order |
| // Just to be precautios, disable scrollstart listening like silentScroll would |
| $.event.special.scrollstart.enabled = false; |
| |
| window.scrollTo( 0, toScroll ); |
| |
| // reenable scrollstart listening like silentScroll would |
| setTimeout( function() { |
| $.event.special.scrollstart.enabled = true; |
| }, 150 ); |
| }, |
| cleanFrom = function() { |
| $from |
| .removeClass( $.mobile.activePageClass + " out in reverse " + name ) |
| .height( "" ); |
| }, |
| startOut = function() { |
| // if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously |
| if ( !sequential ) { |
| doneOut(); |
| } |
| else { |
| $from.animationComplete( doneOut ); |
| } |
| |
| // Set the from page's height and start it transitioning out |
| // Note: setting an explicit height helps eliminate tiling in the transitions |
| $from |
| .height( screenHeight + $.mobile.$window.scrollTop() ) |
| .addClass( name + " out" + reverseClass ); |
| }, |
| |
| doneOut = function() { |
| |
| if ( $from && sequential ) { |
| cleanFrom(); |
| } |
| |
| startIn(); |
| }, |
| |
| startIn = function() { |
| |
| // Prevent flickering in phonegap container: see comments at #4024 regarding iOS |
| $to.css( "z-index", -10 ); |
| |
| $to.addClass( $.mobile.activePageClass + toPreClass ); |
| |
| // Send focus to page as it is now display: block |
| $.mobile.focusPage( $to ); |
| |
| // Set to page height |
| $to.height( screenHeight + toScroll ); |
| |
| scrollPage(); |
| |
| // Restores visibility of the new page: added together with $to.css( "z-index", -10 ); |
| $to.css( "z-index", "" ); |
| |
| if ( !none ) { |
| $to.animationComplete( doneIn ); |
| } |
| |
| $to |
| .removeClass( toPreClass ) |
| .addClass( name + " in" + reverseClass ); |
| |
| if ( none ) { |
| setTimeout( doneIn, 0 ); |
| } |
| |
| }, |
| |
| doneIn = function() { |
| |
| if ( !sequential ) { |
| |
| if ( $from ) { |
| cleanFrom(); |
| } |
| } |
| |
| $to |
| .removeClass( "out in reverse " + name ) |
| .height( "" ); |
| |
| toggleViewportClass(); |
| |
| // In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition |
| // This ensures we jump to that spot after the fact, if we aren't there already. |
| if ( $.mobile.$window.scrollTop() !== toScroll ) { |
| scrollPage(); |
| } |
| |
| deferred.resolve( name, reverse, $to, $from, true ); |
| }; |
| |
| toggleViewportClass(); |
| |
| if ( $from && !none ) { |
| startOut(); |
| } |
| else { |
| doneOut(); |
| } |
| |
| return deferred.promise(); |
| }; |
| }; |
| |
| // generate the handlers from the above |
| var sequentialHandler = createHandler(), |
| simultaneousHandler = createHandler( false ), |
| defaultGetMaxScrollForTransition = function() { |
| return $.mobile.getScreenHeight() * 3; |
| }; |
| |
| // Make our transition handler the public default. |
| $.mobile.defaultTransitionHandler = sequentialHandler; |
| |
| //transition handler dictionary for 3rd party transitions |
| $.mobile.transitionHandlers = { |
| "default": $.mobile.defaultTransitionHandler, |
| "sequential": sequentialHandler, |
| "simultaneous": simultaneousHandler |
| }; |
| |
| $.mobile.transitionFallbacks = {}; |
| |
| // If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified |
| $.mobile._maybeDegradeTransition = function( transition ) { |
| if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) { |
| transition = $.mobile.transitionFallbacks[ transition ]; |
| } |
| |
| return transition; |
| }; |
| |
| // Set the getMaxScrollForTransition to default if no implementation was set by user |
| $.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition; |
| })( jQuery, this ); |
| //>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude); |
| }); |
| //>>excludeEnd("jqmBuildExclude"); |