| //>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude); |
| //>>description: Global initialization of the library. |
| //>>label: Init |
| //>>group: Core |
| |
| |
| define( [ "jquery", "./jquery.mobile.core", "./jquery.mobile.support", "./jquery.mobile.navigation", |
| "./jquery.mobile.navigation.pushstate", "./widgets/loader", "./jquery.mobile.vmouse", "./jquery.hashchange" ], function( jQuery ) { |
| //>>excludeEnd("jqmBuildExclude"); |
| (function( $, window, undefined ) { |
| var $html = $( "html" ), |
| $head = $( "head" ), |
| $window = $.mobile.$window; |
| |
| //remove initial build class (only present on first pageshow) |
| function hideRenderingClass() { |
| $html.removeClass( "ui-mobile-rendering" ); |
| } |
| |
| // trigger mobileinit event - useful hook for configuring $.mobile settings before they're used |
| $( window.document ).trigger( "mobileinit" ); |
| |
| // support conditions |
| // if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, |
| // otherwise, proceed with the enhancements |
| if ( !$.mobile.gradeA() ) { |
| return; |
| } |
| |
| // override ajaxEnabled on platforms that have known conflicts with hash history updates |
| // or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini) |
| if ( $.mobile.ajaxBlacklist ) { |
| $.mobile.ajaxEnabled = false; |
| } |
| |
| // Add mobile, initial load "rendering" classes to docEl |
| $html.addClass( "ui-mobile ui-mobile-rendering" ); |
| |
| // This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire, |
| // this ensures the rendering class is removed after 5 seconds, so content is visible and accessible |
| setTimeout( hideRenderingClass, 5000 ); |
| |
| $.extend( $.mobile, { |
| addEventBlocker: function () { |
| $html.addClass( "ui-blocker" ); |
| $html.bind( "touchstart touchend vclick mousedown mouseup click", function () { |
| return false; |
| } ); |
| }, |
| |
| removeEventBlocker: function () { |
| $html.removeClass( "ui-blocker" ); |
| $html.unbind( "touchstart touchend vclick mousedown mouseup click" ); |
| }, |
| |
| // find and enhance the pages in the dom and transition to the first page. |
| initializePage: function() { |
| // find present pages |
| var $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ), |
| hash = $.mobile.path.parseLocation().hash.replace("#", ""), |
| hashPage = document.getElementById( hash ); |
| |
| // if no pages are found, create one with body's inner html |
| if ( !$pages.length ) { |
| $pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 ); |
| } |
| |
| // add dialogs, set data-url attrs |
| $pages.each(function() { |
| var $this = $( this ); |
| |
| // unless the data url is already set set it to the pathname |
| if ( !$this[0].getAttribute( "data-" + $.mobile.ns + "url" ) ) { |
| $this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search ); |
| } |
| }); |
| |
| // define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) |
| $.mobile.firstPage = $pages.first(); |
| |
| // define page container |
| $.mobile.pageContainer = $.mobile.firstPage.parent().addClass( "ui-mobile-viewport" ); |
| |
| // alert listeners that the pagecontainer has been determined for binding |
| // to events triggered on it |
| $window.trigger( "pagecontainercreate" ); |
| |
| // cue page loading message |
| $.mobile.showPageLoadingMsg(); |
| $.mobile.addEventBlocker(); |
| |
| //remove initial build class (only present on first pageshow) |
| hideRenderingClass(); |
| |
| // if hashchange listening is disabled, there's no hash deeplink, |
| // the hash is not valid (contains more than one # or does not start with #) |
| // or there is no page with that hash, change to the first page in the DOM |
| // Remember, however, that the hash can also be a path! |
| if ( ! ( $.mobile.hashListeningEnabled && |
| $.mobile.path.isHashValid( location.hash ) && |
| ( $( hashPage ).is( ':jqmData(role="page")' ) || |
| $.mobile.path.isPath( hash ) || |
| hash === $.mobile.dialogHashKey ) ) ) { |
| |
| // Store the initial destination |
| if ( $.mobile.path.isHashValid( location.hash ) ) { |
| $.mobile.urlHistory.initialDst = hash.replace( "#", "" ); |
| } |
| $.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } ); |
| } |
| // otherwise, trigger a hashchange to load a deeplink |
| else { |
| $window.trigger( "hashchange", [ true ] ); |
| } |
| } |
| }); |
| |
| // initialize events now, after mobileinit has occurred |
| $.mobile.navreadyDeferred.resolve(); |
| |
| // check which scrollTop value should be used by scrolling to 1 immediately at domready |
| // then check what the scroll top is. Android will report 0... others 1 |
| // note that this initial scroll won't hide the address bar. It's just for the check. |
| $(function() { |
| // window.scrollTo( 0, 1 ); |
| |
| // if defaultHomeScroll hasn't been set yet, see if scrollTop is 1 |
| // it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar) |
| // so if it's 1, use 0 from now on |
| $.mobile.defaultHomeScroll = ( !$.support.scrollTop || $.mobile.$window.scrollTop() === 1 ) ? 0 : 1; |
| |
| |
| // TODO: Implement a proper registration mechanism with dependency handling in order to not have exceptions like the one below |
| //auto self-init widgets for those widgets that have a soft dependency on others |
| if ( $.fn.controlgroup ) { |
| $.mobile.$document.bind( "pagecreate create", function( e ) { |
| $( ":jqmData(role='controlgroup')", e.target ) |
| .jqmEnhanceable() |
| .controlgroup({ excludeInvisible: false }); |
| }); |
| } |
| |
| //dom-ready inits |
| if ( $.mobile.autoInitializePage ) { |
| $.mobile.initializePage(); |
| } |
| |
| // window load event |
| // hide iOS browser chrome on load |
| $window.load( $.mobile.silentScroll ); |
| |
| if ( !$.support.cssPointerEvents ) { |
| // IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons |
| // by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser. |
| // https://github.com/jquery/jquery-mobile/issues/3558 |
| |
| $.mobile.$document.delegate( ".ui-disabled", "vclick", |
| function( e ) { |
| e.preventDefault(); |
| e.stopImmediatePropagation(); |
| } |
| ); |
| } |
| }); |
| }( jQuery, this )); |
| //>>excludeStart("jqmBuildExclude", pragmas.jqmBuildExclude); |
| }); |
| //>>excludeEnd("jqmBuildExclude"); |