" ).parent();
-
- $.each(copyAttrs,function(i){
- if( newPage.attr( copyAttrs[ i ] ) ){
- wrapper.attr( copyAttrs[ i ], newPage.attr( copyAttrs[ i ] ) );
- newPage.removeAttr( copyAttrs[ i ] );
- }
- });
- return wrapper;
- }
-
- //remove active classes after page transition or error
- function removeActiveLinkClass(forceRemoval){
- if( !!$activeClickedLink && (!$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval )){
- $activeClickedLink.removeClass( $.mobile.activeBtnClass );
- }
- $activeClickedLink = null;
- }
+ : undefined;
- //for getting or creating a new page
- function changePage( to, transition, back, changeHash){
-
- //from is always the currently viewed page
- var toIsArray = $.type(to) === "array",
- from = toIsArray ? to[0] : $.mobile.activePage,
- to = toIsArray ? to[1] : to,
- url = fileUrl = $.type(to) === "string" ? to.replace( /^#/, "" ) : null,
- data = undefined,
- type = 'get',
- isFormRequest = false,
- duplicateCachedPage = null,
- back = (back !== undefined) ? back : ( urlStack.length > 1 && urlStack[ urlStack.length - 2 ].url === url ),
- transition = (transition !== undefined) ? transition : $.mobile.defaultTransition;
+//add mobile, initial load "rendering" classes to docEl
+ $html.addClass('ui-mobile ui-mobile-rendering');
- if( $.type(to) === "object" && to.url ){
- url = to.url,
- data = to.data,
- type = to.type,
- isFormRequest = true;
- //make get requests bookmarkable
- if( data && type == 'get' ){
- url += "?" + data;
- data = undefined;
- }
- }
- //reset base to pathname for new request
- resetBaseURL();
-
- // if the new href is the same as the previous one
- if ( back ) {
- var pop = urlStack.pop();
- if( pop ){
- transition = pop.transition;
- }
- } else {
- urlStack.push({ url: url, transition: transition });
- }
-
- //function for transitioning between two existing pages
- function transitionPages() {
-
- //kill the keyboard
- $( window.document.activeElement ).blur();
-
- //get current scroll distance
- var currScroll = $window.scrollTop();
-
- //set as data for returning to that spot
- from.data('lastScroll', currScroll);
-
- //trigger before show/hide events
- from.data("page")._trigger("beforehide", {nextPage: to});
- to.data("page")._trigger("beforeshow", {prevPage: from});
-
- function loadComplete(){
- pageLoading( true );
- //trigger show/hide events, allow preventing focus change through return false
- if( from.data("page")._trigger("hide", null, {nextPage: to}) !== false && to.data("page")._trigger("show", null, {prevPage: from}) !== false ){
- $.mobile.activePage = to;
- }
- reFocus( to );
- if( changeHash && url ){
- $.mobile.updateHash(url, true);
- }
- removeActiveLinkClass();
-
- //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
- if( duplicateCachedPage != null ){
- duplicateCachedPage.remove();
- }
-
- //jump to top or prev scroll, if set
- silentScroll( to.data( 'lastScroll' ) );
- }
-
- if(transition && (transition !== 'none')){
- $pageContainer.addClass('ui-mobile-viewport-transitioning');
- // animate in / out
- from.addClass( transition + " out " + ( back ? "reverse" : "" ) );
- to.addClass( $.mobile.activePageClass + " " + transition +
- " in " + ( back ? "reverse" : "" ) );
-
- // callback - remove classes, etc
- to.animationComplete(function() {
- from.add( to ).removeClass("out in reverse " + transition );
- from.removeClass( $.mobile.activePageClass );
- loadComplete();
- $pageContainer.removeClass('ui-mobile-viewport-transitioning');
- });
- }
- else{
- from.removeClass( $.mobile.activePageClass );
- to.addClass( $.mobile.activePageClass );
- loadComplete();
- }
- };
-
- //shared page enhancements
- function enhancePage(){
- setPageRole( to );
- to.page();
- }
-
- //get the actual file in a jq-mobile nested url
- function getFileURL( url ){
- return url.match( '&' + $.mobile.subPageUrlKey ) ? url.split( '&' + $.mobile.subPageUrlKey )[0] : url;
- }
-
- //if url is a string
- if( url ){
- to = $( "[id='" + url + "']" ),
- fileUrl = getFileURL(url);
- }
- else{ //find base url of element, if avail
- var toID = to.attr('id'),
- toIDfileurl = getFileURL(toID);
-
- if(toID != toIDfileurl){
- fileUrl = toIDfileurl;
- }
- }
-
- // find the "to" page, either locally existing in the dom or by creating it through ajax
- if ( to.length && !isFormRequest ) {
- if( fileUrl ){
- setBaseURL(fileUrl);
- }
- enhancePage();
- transitionPages();
- } else {
-
- //if to exists in DOM, save a reference to it in duplicateCachedPage for removal after page change
- if( to.length ){
- duplicateCachedPage = to;
- }
-
- pageLoading();
-
- $.ajax({
- url: fileUrl,
- type: type,
- data: data,
- success: function( html ) {
- setBaseURL(fileUrl);
- var all = $("
");
- //workaround to allow scripts to execute when included in page divs
- all.get(0).innerHTML = html;
- to = all.find('[data-role="page"]');
-
- //rewrite src and href attrs to use a base url
- if( !$.support.dynamicBaseTag ){
- var baseUrl = getBaseURL(fileUrl);
- to.find('[src],link[href]').each(function(){
- var thisAttr = $(this).is('[href]') ? 'href' : 'src',
- thisUrl = $(this).attr(thisAttr);
-
- //if full path exists and is same, chop it - helps IE out
- thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );
-
- if( !/^(\w+:|#|\/)/.test(thisUrl) ){
- $(this).attr(thisAttr, baseUrl + thisUrl);
- }
- });
- }
-
- //preserve ID on a retrieved page
- if ( to.attr('id') ) {
- to = wrapNewPage( to );
- }
-
- to
- .attr( "id", fileUrl )
- .appendTo( $pageContainer );
-
- enhancePage();
- transitionPages();
- },
- error: function() {
- pageLoading( true );
- removeActiveLinkClass(true);
- $("
Error Loading Page
")
- .css({ "display": "block", "opacity": 0.96, "top": $(window).scrollTop() + 100 })
- .appendTo( $pageContainer )
- .delay( 800 )
- .fadeOut( 400, function(){
- $(this).remove();
- });
- }
- });
- }
-
- };
+//define & prepend meta viewport tag, if content is defined
+ $.mobile.metaViewportContent ? $("
", { name: "viewport", content: $.mobile.metaViewportContent}).prependTo( $head ) : undefined;
- $(function() {
-
- $body = $( "body" );
- pageLoading();
-
- // needs to be bound at domready (for IE6)
- // find or load content, make it active
- $window.bind( "hashchange", function(e, triggered) {
- if( !hashListener ){
- hashListener = true;
- return;
- }
-
- if( $(".ui-page-active").is("[data-role=" + $.mobile.nonHistorySelectors + "]") ){
- return;
- }
-
- var to = location.hash,
- transition = triggered ? false : undefined;
-
- // either we've backed up to the root page url
- // or it's the first page load with no hash present
- //there's a hash and it wasn't manually triggered
- // > probably a new page, "back" will be figured out by changePage
- if ( to ){
- changePage( to, transition);
- }
- //there's no hash, the active page is not the start page, and it's not manually triggered hashchange
- // > probably backed out to the first page visited
- else if( $.mobile.activePage.length && $startPage[0] !== $.mobile.activePage[0] && !triggered ) {
- changePage( $startPage, transition, true );
- }
- else{
- $startPage.trigger("pagebeforeshow", {prevPage: $('')});
- $startPage.addClass( $.mobile.activePageClass );
- pageLoading( true );
-
- if( $startPage.trigger("pageshow", {prevPage: $('')}) !== false ){
- reFocus($startPage);
- }
- }
-
- });
- });
-
- //animation complete callback
- //TODO - update support test and create special event for transitions
- //check out transitionEnd (opera per Paul's request)
- $.fn.animationComplete = function(callback){
- if($.support.cssTransitions){
- return $(this).one('webkitAnimationEnd', callback);
- }
- else{
- callback();
- }
- };
-
- //TODO - add to jQuery.mobile, not $
+//expose some core utilities
$.extend($.mobile, {
- pageLoading: pageLoading,
- changePage: changePage,
- silentScroll: silentScroll
- });
-
- //dom-ready
+
+ // turn on/off page loading message.
+ pageLoading: function ( done ) {
+ if ( done ) {
+ $html.removeClass( "ui-loading" );
+ } else {
+ if( $.mobile.loadingMessage ){
+ $loader.appendTo($.mobile.pageContainer).css({top: $(window).scrollTop() + 75});
+ }
+ $html.addClass( "ui-loading" );
+ }
+ },
+
+ //scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value
+ silentScroll: function( ypos ) {
+ // prevent scrollstart and scrollstop events
+ $.event.special.scrollstart.enabled = false;
+ setTimeout(function() {
+ window.scrollTo( 0, ypos || 0 );
+ },20);
+ setTimeout(function() {
+ $.event.special.scrollstart.enabled = true;
+ }, 150 );
+ }
+ });
+
+
+//dom-ready inits
$(function(){
+
+ //find present pages
var $pages = $("[data-role='page']");
+
//set up active page
- $startPage = $.mobile.activePage = $pages.first();
+ $.mobile.startPage = $.mobile.activePage = $pages.first();
//set page container
- $pageContainer = $startPage.parent().addClass('ui-mobile-viewport');
+ $.mobile.pageContainer = $.mobile.startPage.parent().addClass('ui-mobile-viewport');
- $.extend({
- pageContainer: $pageContainer
- });
+ //cue page loading message
+ $.mobile.pageLoading();
//initialize all pages present
$pages.page();
@@ -582,6 +139,9 @@
$html.removeClass('ui-mobile-rendering');
});
- $window.load(silentScroll);
+
+//window load event
+ //hide iOS browser chrome on load
+ $window.load( $.mobile.silentScroll );
})( jQuery, this );
diff --git a/js/jquery.mobile.forms.select.js b/js/jquery.mobile.forms.select.js
index 22e8c265..cfb2106d 100644
--- a/js/jquery.mobile.forms.select.js
+++ b/js/jquery.mobile.forms.select.js
@@ -65,7 +65,7 @@ $.widget( "mobile.selectmenu", $.mobile.widget, {
"
"+
"" ).parent();
+
+ $.each(copyAttrs,function(i){
+ if( to.attr( copyAttrs[ i ] ) ){
+ wrapper.attr( copyAttrs[ i ], to.attr( copyAttrs[ i ] ) );
+ to.removeAttr( copyAttrs[ i ] );
+ }
+ });
+ to = wrapper;
+ }
+
+ to
+ .attr( "id", fileUrl )
+ .appendTo( $.mobile.pageContainer );
+
+ enhancePage();
+ transitionPages();
+ },
+ error: function() {
+ $.mobile.pageLoading( true );
+ removeActiveLinkClass(true);
+ $("
Error Loading Page
")
+ .css({ "display": "block", "opacity": 0.96, "top": $(window).scrollTop() + 100 })
+ .appendTo( $.mobile.pageContainer )
+ .delay( 800 )
+ .fadeOut( 400, function(){
+ $(this).remove();
+ });
+ }
+ });
+ }
+
+ };
+
+
+
+
+/* Event Bindings - hashchange, submit, and click */
+
+ //bind to form submit events, handle with Ajax
+ $('form').live('submit', function(event){
+ if( !$.mobile.ajaxFormsEnabled ){ return; }
+
+ var type = $(this).attr("method"),
+ url = $(this).attr( "action" ).replace( location.protocol + "//" + location.host, "");
+
+ //external submits use regular HTTP
+ if( /^(:?\w+:)/.test( url ) ){
+ return;
+ }
+
+ //if it's a relative href, prefix href with base url
+ if( url.indexOf('/') && url.indexOf('#') !== 0 ){
+ url = path.get() + url;
+ }
+
+ $.mobile.changePage({
+ url: url,
+ type: type,
+ data: $(this).serialize()
+ },
+ undefined,
+ undefined,
+ true
+ );
+ event.preventDefault();
+ });
+
+
+ //click routing - direct to HTTP or Ajax, accordingly
+ $( "a" ).live( "click", function(event) {
+ if( !$.mobile.ajaxLinksEnabled ){ return; }
+ var $this = $(this),
+ //get href, remove same-domain protocol and host
+ href = $this.attr( "href" ).replace( location.protocol + "//" + location.host, ""),
+ //if target attr is specified, it's external, and we mimic _blank... for now
+ target = $this.is( "[target]" ),
+ //if it still starts with a protocol, it's external, or could be :mailto, etc
+ external = target || /^(:?\w+:)/.test( href ) || $this.is( "[rel=external]" ),
+ target = $this.is( "[target]" );
+
+ if( href === '#' ){
+ //for links created purely for interaction - ignore
+ return false;
+ }
+
+ $activeClickedLink = $this.closest( ".ui-btn" ).addClass( $.mobile.activeBtnClass );
+
+ if( external || !$.mobile.ajaxLinksEnabled ){
+ //remove active link class if external
+ removeActiveLinkClass(true);
+
+ //deliberately redirect, in case click was triggered
+ if( target ){
+ window.open(href);
+ }
+ else{
+ location.href = href;
+ }
+ }
+ else {
+ //use ajax
+ var transition = $this.data( "transition" ),
+ back = $this.data( "back" ),
+ changeHashOnSuccess = !$this.is( "[data-rel="+ $.mobile.nonHistorySelectors +"]" );
+
+ nextPageRole = $this.attr( "data-rel" );
+
+ //if it's a relative href, prefix href with base url
+ if( href.indexOf('/') && href.indexOf('#') !== 0 ){
+ href = path.get() + href;
+ }
+
+ href.replace(/^#/,'');
+
+ $.mobile.changePage(href, transition, back, changeHashOnSuccess);
+ }
+ event.preventDefault();
+ });
+
+
+
+ //hashchange event handler
+ $window.bind( "hashchange", function(e, triggered) {
+ if( !hashListener ){
+ hashListener = true;
+ return;
+ }
+
+ if( $(".ui-page-active").is("[data-role=" + $.mobile.nonHistorySelectors + "]") ){
+ return;
+ }
+
+ var to = location.hash,
+ transition = triggered ? false : undefined;
+
+ //if to is defined, use it
+ if ( to ){
+ $.mobile.changePage( to, transition);
+ }
+ //there's no hash, the active page is not the start page, and it's not manually triggered hashchange
+ //we probably backed out to the first page visited
+ else if( $.mobile.activePage.length && $.mobile.startPage[0] !== $.mobile.activePage[0] && !triggered ) {
+ $.mobile.changePage( $.mobile.startPage, transition, true );
+ }
+ //probably the first page - show it
+ else{
+ $.mobile.startPage.trigger("pagebeforeshow", {prevPage: $('')});
+ $.mobile.startPage.addClass( $.mobile.activePageClass );
+ $.mobile.pageLoading( true );
+
+ if( $.mobile.startPage.trigger("pageshow", {prevPage: $('')}) !== false ){
+ reFocus($.mobile.startPage);
+ }
+ }
+ });
+})( jQuery );
\ No newline at end of file