Our third jQuery Mobile tutorial is ready. The new lesson tells about mobile page orientation, page events (pagebeforecreate, pagecreate, pageinit etc), touch and swipe events, virtual mouse events. Multiple examples demonstrates how you can use these events.
ADAPTING TO THE ORIENTATION EVENT
When viewing a mobile device, there are two options or modes for screen orientation. When a page is viewed in portrait, it means that the height of the screen is greater than the width of the screen. When a page is viewed in landscape, the width of the screen is greater than the height of the screen.
Unless the device is locked into one viewing mode, the screen can be rotated and content shifted dynamically to make use of the extra space. While jQuery Mobile handles the resize of many of your elements, you may want to trigger a custom function whenever a screen change is detected.
Using the orientationchange Event
Example 7: orientation change Event
!DOCTYPE html html head meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" script src="http://code.jquery.com/jquery-1.11.3.min.js"/script script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"/script script $(document).on("pagecreate",function(event){ $(window).on("orientationchange",function(){ if(window.orientation == 0) { $("p").text("The orientation has changed to portrait!").css({"background-color":"yellow","font-size":"300%"}); } else { $("p").text("The orientation has changed to landscape!").css({"background-color":"pink","font-size":"200%"}); } }); }); /script /head body div data-role="page" div data-role="header" h1The orientationchange Event/h1 /div div data-role="main" class="ui-content" pTry to rotate your device!/p pbNote:/b You must use a mobile device, or a mobile emulator to see the effect of this event./p /div div data-role="footer" h1Footer Text/h1 /div /div /body /html
!DOCTYPE html html head titleScript-tutorials: Page orientaton Event/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" script src="http://code.jquery.com/jquery-1.11.3.min.js"/script script $(document).on('pageinit', function() { $(window).on('orientationchange', function(e) { $("#mode").html('orientation is currently '+e.orientation); }); }); /script script src="http://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"/script /head body div data-role="page" id="mode" div data-role="header"h1Page orientaton Event/h1/div div data-role="main" class="ui-content" pContent in orientation/p a href="pageexist.html" data-role="button"External Page Exist/a a href="page_notexist.html" data-role="button"No Page Exist/a pTry to rotate your device!/p pbNote:/b You must use a mobile device, or a mobile emulator to see the effect of this event./p /div div data-role="footer" h1Script-tutorials.com/h1 /div /div /body /html
INITIALIZING PAGE IN JQUERY MOBILE
Example 8: initializing page in jQuery mobile
Page markup before jQuery Mobile initializationPage markup after jQuery Mobile initialization
!-- begin first page -- section id="page1" data-role="page" header data-role="header"h1jQuery Mobile/h1/header div data-role="content" pFirst page!/p /div footer data-role="footer"h1Footer/h1/footer /section !-- end first page --
!-- begin first page -- section class="ui-page ui-body-c ui-page-active" data-url="page1" id="page1" data-role="page" header role="banner" class="ui-bar-a ui-header" data-role="header" h1 aria-level="1" role="heading" tabindex="0" class="ui-title"jQuery Mobile/h1 /header div role="main" data-role="content" class="ui-content" pFirst page!/p /div footer role="contentinfo" class="ui-bar-a ui-footer" data-role="footer" h1 aria-level="1" role="heading" tabindex="0" class="ui-title"Footer/h1 /footer /section !-- end first page --
Both markup script Page markup after jQuery Mobile initialization and Page markup before jQuery Mobile initialization gives same result:
When building a jQuery application, it is common practice to bind your event handlers on document load. You can do something similar using jQuery Mobile’s page hide and show events, but be careful. Since the page hide and show events are triggered every time a page transition happens, you might bind the event handlers more than once. For example, if you bind a click event listener to an element within a page show event, that click event listener will be bound every time that page is shown. If you are only using that page once, that’s fine, but if the user goes to that page multiple times, then the event listener will be bound multiple times.
To get around this problem, you can either check to see if you have already bound the event handler (and if you have, do not bind it again), or clear the binding each time before you rebind. If you use the latter method, namespacing your bindings can be particularly useful. For more information on namespaced events, see http://docs.jquery.com/Namespaced_Events. Namespaced events are a useful tool to have in your jQuery toolbox.
USING PAGEBEFORECREATE TO DYNAMICALLY ADD AN ATTRIBUTE
The pagebeforecreate event is used when you have content that you want modified before jQuery Mobile has had a chance to lock in and write the data-roles and attributes of page elements to the DOM.
Example 9: using pagebeforecreate to dynamically add an attribute
The file starts out as a standard HTML file that uses jQuery Mobile, but we start a script element. Some jQuery code that is used to bind the pagebeforecreate event to the document. This is done by using the .on()
function that is available when using jQuery 1.7+. When the pagebeforecreate event runs it searches for any elements that have an attribute of class="modify"
and applies an attribute of datainset="true"
to any that are found by using the .attr()
function.
Because the pagebeforecreate event runs before the page code is added to the DOM, jQuery Mobile sees the data-inset="true"
attribute and styles it as an inset list.
!DOCTYPE html html head titleScript-tutorials: Developing with jQuery Mobile/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script $(document).on('pagebeforecreate', function(event) { $(".modify").attr('data-inset','true'); }); /script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" id="home" div data-role="header"h1pagebeforecreate event/h1/div div data-role="content" pThe following list will be inset during the pagebeforecreate event/p ul class="modify" data-role="listview" liA/li liB/li liC/li /ul /div /div /body /html
USING THE PAGECREATE EVENT
The pagecreate event can be used either to apply your own widgets or to use the built-in widget or plug-in controls that jQuery Mobile provides.
Example 8: using the pagecreate event in conjuction with the listview plug-in
The code starts out as a standard page using jQuery Mobile, and the .on()
function is using the pagecreate event to run.
There is a selector that finds any element on the page that has a class="modify"
attribute and then adds an attribute of data-inset="true"
. After that has been done you can see that a function called listview()
is being run. This function is known as the listview plug-in and is used to apply the styles and markup for a list. Line 11 then closes the .on()
function, which is the binding to the pagecreate event.
There is a ul element that contains only an attribute of class="modify"
. The data-role="listview"
attribute is not present, and neither is the data-inset="true"
attribute.
!DOCTYPE html html head titleScript-tutorials: Developing with jQuery Mobile/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script $(document).on('pagecreate', function(event) { $(".modify").attr('data-inset','true').listview(); }); /script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" id="home" div data-role="header"h1pagecreate event/h1/div div data-role="content" pThe following list will be styled during the pagecreate event/p ul class="modify" liA/li liB/li liC/li /ul /div /div /body /html
USING THE PAGEINIT EVENT
The pageinit event is best described and used as you would use the $(document).ready()
function of jQuery. This event is triggered after the DOM has been loaded and all widgets and plug-ins have been run. This event also is triggered whenever a page is loaded either directly or through the AJAX call of another page. This event is triggered only once when included in the DOM.
Using pageinit When Loading the Second Page
The initial page setup should be familiar by now. Starting you can see the same method is employed to bind the pageinit event as was used to bind the pagebeforecreate and pagecreate events. The difference of course is where a selector for an element with an id="away"
is used in the .on()
function to bind an alert() function that will only run on the page with that selector when it is first loaded into the DOM.
Continuing down the code you can see that a page has been set up with a div element using the data-role="page"
attribute.
Example 9: using the pageinit when loading the second page
!DOCTYPE html html head titleScript-tutorials: Developing with jQuery Mobile/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script $(document).on('pageinit','#away', function(event) { alert("The pageinit event has been run"); }); /script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" id="home" div data-role="header"h1pageinit event/h1/div div data-role="content" pI am the #home page/p a href="#away" data-role="button"Go Away/a /div /div div data-role="page" id="away" div data-role="header"h1pageinit event/h1/div div data-role="content" p I am the #away page. The pageinit event runs on first page load. /p a href="#home" data-role="button"Go Back/a /div /div /body /html
1st image on preview in a browser 2nd image when Go Away button is click on preview in a browser 3rd image of the initialized image
Now lets consider A jQuery Mobile Page Initialization Pattern
Example 10: Nice tweet without initialization script
!DOCTYPE html html head titleScript-Tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css"/ script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style img {max-width:100%;} p{text-align:center;} /style /head body !-- begin first page -- section id="page1" data-role="page" header data-role="header" h1Nice Tweet/h1 /header div data-role="content" class="content" pTwitter feed goes here./p pa href="#page2" data-role="button"Settings/a/p pimg src="images/twitter-logo-hashtag.jpg" alt="Twitter settings" //p pPowered by jQuery Mobile/p /div footer data-role="footer" h2Because the world needed another Twitter app./h2 /footer /section !-- end first page -- !-- Begin second page -- section id="page2" data-role="page" header data-role="header" h1 Nice Tweet: Settings/h1 /header div data-role="content" class="content" pSettings go here.nbsp;a href="#page1" data-role="button"Go back/a/p pimg src="images/business-twitter-page-img.png" alt="Settings" //p p style="text-align:center;"Powered by jQuery Mobile/p /div footer data-role="footer" h2Because the world needed another Twitter app./h2 /footer /section !-- end second page -- /body /html
script $(document).ready(function() { // Refresh the feed on first load // (pretend we've written this function elsewhere) refreshFeed(); $("#page1").bind("pageshow", function(event, ui) { // Refresh the feed on subsequent page shows refreshFeed(); }) }) /script
TOUCH EVENTS
Whenever users interact by touch with your site they are triggering touch events. You can tap (pardon the pun) into these events to run custom functions.
USING TAP EVENTS
The main difference between a click and touchstart event is about 300ms. While that may not seem like a lot of time, an almost 1/3 of a second delay can make your mobile site or application feel slow and unresponsive. While the tap event is used by default on links, lists, and similar jQuery Mobile plug-ins and widgets, you can use the tap event to trigger custom functions on different elements on your page.
Example 11: Using the tap and taphold events
!DOCTYPE html html head titleDeveloping with jQuery Mobile/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script $(document).on("pageinit", function(){ $("#home").on('tap', '#image', function(event, ui) { var tapCaption = $(this).data("tap"); $("#caption").addClass("comment").html(tapCaption); }); $("#home").on('taphold','#caption', function(event, ui) { var $this = $(this); var tapholdCaption = $this.data("appTaphold"); $this.html(tapholdCaption); }); }); /script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style type="text/css" img {max-width: 100%} .comment {background: border-radius: 5px; border: 2px solid padding: 5px} /style /head body div data-role="page" id="home" div data-role="header"h1Tap Events/h1/div div data-role="content" pTap or tap-and-hold the image below./p img id="image" src="images/golden_gate.jpg" alt="An image of a river" data-tap="You tapped the picture, try tap-and-holding on this caption" / div id="caption" data-app-taphold="This picture was taken during a flood."Caption/div /div /div /body /html
The tap and taphold events must be bound in either the document.ready() function or inside the pageinit event. Since we already know that using the document.ready() function is not recommended for use with jQuery Mobile, we are binding the pageinit event using the .on() function. Inside the function, you can see the .on() function attaching the tap event to an element with an attribute of id=”image”.
USING SWIPE EVENTS
Swiping at your mobile device is common when moving through image galleries, deleting email, bringing up contact information, and more. With jQuery Mobile you can tap into three swipe events: swipe, swipeleft, and swiperight. A swipe is similar to a click-and-drag action on a computer. For any of the swipe events to trigger, the touch must travel more than 30px horizontally and take less than 1 second to complete. It also may not move more than 20px vertically or the event trigger will be cancelled.
Example 12: using swipe events
The below image is shown when swipe the box to the right as it previews on your mobile browser on your device.
!DOCTYPE html html head titleDeveloping with jQuery Mobile/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script $(document).on('pageinit', function() { $("#home").on('swipe','#swipe', function(event, ui) { $("#caption").html("Swipe detected!"); }); $("#home").on('swipeleft','#swipe-box', function(event, ui) { ("#caption").html("Swipe to the left detected!"); }); $("#home").on('swiperight','#swipe-box', function(event, ui) { $("#caption").html("Swipe to the right detected!"); }); }); /script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style type="text/css" #swipe-box { width: 200px; height: 200px; background: border: 2px solid #000 } .comment { background: border-radius: 5px; border: 2px solid padding: 5px } /style /head body div data-role="page" id="home" div data-role="header"h1Swipe Events/h1/div div data-role="content" p id="swipe"Take a swipe this text or at the box below./p div id="swipe-box"/div br / div id="caption" class="comment"Waiting for swipe.../div /div /div /body /html
VIRTUAL MOUSE EVENTS
The virtual mouse events are an answer to compatibility problems between mobile and desktop browsers. For example, some mobile browsers support an event called touchstart, while other mobile browsers do not. Desktop browsers support the mousemove event and have support for hover through the use of the mouseover event while mobile devices have a hard time emulating or using the correct event. These problems are solved in jQuery Mobile by using virtual mouse events. When a page is loaded with jQuery Mobile, the browser is checked for event support.
Events are then supported based on the virtual mouse events. While this happens in the background, you can bind virtual mouse events to run specific functions, or even to get data that can be used in other functions.
The virtual mouse events that are available are
- vmouseover
- vmousedown
- vmousemove
- vmouseup
- vclick
- vmousecancel
To use the vmousedown, vmousemove, and vmouseover Events snippet of code below is included in the head tag head/head
Example 13: snippet of code for vmousedown, vmousemove and vmouseover
script $(function(){ $(document).on("vmousedown", "p", function() { $(this).append('span style="color:"vmousedown.../span'); }); }); /script
Example 14: vmousedown in jQuery mobile
Once you click on the caption inside your browser an event will trigger vmousedown
!doctype html html lang="en" head meta charset="utf-8" meta name="viewport" content="width=device-width, initial-scale=1" titleScript-tutorials: vmousedown/title link rel="stylesheet" href="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" / script src="//code.jquery.com/jquery-1.10.2.min.js"/script script $( function(){ $(document).on("vmousedown", "p", function() { $(this).append('span style="color:" vmousedown.../span'); }); }); /script script src="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"/script /head body div data-role="page" div data-role="header"h1Vmousedown event example/h1/div div data-role="content" pTouch here to see what happens./p /div /div /body /html
Example 15: vmouseup event in jQuery mobile
!doctype html html lang="en" head meta charset="utf-8" meta name="viewport" content="width=device-width, initial-scale=1" titleScript-tutorials: vmouseup/title link rel="stylesheet" href="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" / script src="//code.jquery.com/jquery-1.10.2.min.js"/script script $(function() { $(document).on("vmouseup", "p", function() { $(this).append('span style="color:" vmouseup when you click i will not until you releases the click button up.../span'); }); }); /script script src="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"/script /head body div data-role="page" div data-role="header" h1VmouseUp event example/h1 /div div data-role="content" pTouch here to see what happens./p /div /div /body /html
Example 16: vmouseup event in jQuery mobile
!doctype html html lang="en" head meta charset="utf-8" meta name="viewport" content="width=device-width, initial-scale=1" titleScript-tutorials: vmouseover/title link rel="stylesheet" href="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" / script src="//code.jquery.com/jquery-1.10.2.min.js"/script script $(function() { $(document).on("vmouseover", "p", function() { $(this).append('span style="color:" vmouseover I will not appear unless you move the pointer over that touche and see.../span'); }); }); /script script src="//code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js"/script /head body div data-role="page" div data-role="header" h1VmouseOver event example/h1 /div div data-role="content" pTouch here to see what happens./p /div /div /body /html
BUILDING YOUR FIRST MOBILE SITE USING JQUERY MOBILE
The Header
This section is the first thing a user sees, and may be the most prominent feature of your mobile site. This informs users where they are, and may include a search bar, a call-to-action button, and/or a logo.
The Content Area
Content areas are exactly what they sound like: buttons, text, call-outs, and everything else that is not already included in the other sections. The content area houses the core of your site and displays everything you want the user to see, absorb, or spend time on.
The Footer
The footer is an often overlooked but important area of your site. It can contain everything from extra links to a simple credit line for ownership of the site. In mobile development the footer is often omitted and replaced with a navigation bar or other static element.
Example 16: basic mobile sit layout
!DOCTYPE html html head titleScript-tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" div data-role="content" Welcome message. /div /div /body /html
ADDING A HEADER AND FOOTER
Example 17: adding a header and footer to mobile site
!DOCTYPE html html head titleScript-tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" div data-role="header" My First Mobile Site /div div data-role="content" Welcome to my first mobile site. /div div data-role="footer" Tutors footer! /div /div /body /html
FORMATTING TEXT CONTENT
The Mobile Site with Included Formatting Tags
Example 18: mobile site with included formatting tags
!DOCTYPE html html head titleScript-tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script /head body div data-role="page" div data-role="header" h1My First Mobile Site/h1 /div div data-role="content" pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use any strongvalid HTML/strong on this page/p p style="text-align:center;"Powered by jQuery Mobile/p /div div data-role="footer" h3Tutors footer!/h3 /div /div /body /html
ADDING IMAGE IN MOBILE SITE
The Mobile Site with the Addition of an Image That Will Scale
Example 19: adding image in a mobile site
!DOCTYPE html html head titleMy first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style img { max-width: 100%; } /style /head body div data-role="page" div data-role="header" h1My First Mobile Site/h1 /div div data-role="content" pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use anystrongvalid HTML/strong on this page/p img src="images/golden_gate.jpg" alt="Golden Gate Bridge" / p style="text-align:center;"Powered by jQuery Mobile/p /div div data-role="footer" h3Tutor footer!/h3 /div /div /body /html
LINKING TO A SECOND PAGE
Example 20: vmouseup event in jQuery mobile
!DOCTYPE html html head titleScript-Tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style img { max-width: 100%; } /style /head body div id="pageone" data-role="page" div data-role="header" h1My First Mobile Site/h1 /div div data-role="content" pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use any strongvalid HTML/strong on this page/p img src="images/golden_gate.jpg" alt="Golden Gate Bridge" / a href="#pagetwo" data-role="button"Go to Page 2/a p style="text-align:center;"Powered by jQuery Mobile/p /div div data-role="footer" h3Tutor footer!/h3 /div /div div id="pagetwo" data-role="page" div data-role="header" h1My First Mobile Site/h1 /div div data-role="content" pYou've made it to page 2!/p pIsn't that awesome?/p a href="#pageone" data-role="button"Go Back to Page 1/a p style="text-align:center;"Powered by jQuery Mobile/p /div div data-role="footer" h3Viva la footer!/h3 /div /div /body /html
PAGES
Internal pages
Multiple internal pages in one HTML document
Example 21: example of three internal pages
!DOCTYPE html html head titleScript-Tutorials: My first mobile site/title meta name="viewport" content="width=device-width, initial-scale=1" link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" / script src="http://code.jquery.com/jquery-1.7.1.min.js"/script script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"/script style img { max-width: 100%; } /style /head body !-- begin first page -- section id="page1" data-role="page" header data-role="header" h1jQuery Mobile/h1 /header div data-role="content" class="content" pFirst page!/p pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use anystrongvalid HTML/strong on this page/p img src="images/golden_gate.jpg" alt="Golden Gate Bridge" / p style="text-align:center;"Powered by jQuery Mobile/p pa href="#page2" data-role="button"Go to Second Page/a /p /div footer data-role="footer" h1Footer/h1 /footer /section !-- end first page -- !-- Begin second page -- section id="page2" data-role="page" header data-role="header" h1jQuery Mobile/h1 /header div data-role="content" class="content" pSecond page!/p pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use anystrongvalid HTML/strong on this page/p img src="images/cable_car2.jpg" alt="Cable Car" / p style="text-align:center;"Powered by jQuery Mobile/p pa href="#page3" data-role="button"Go to Third Page/a /p /div footer data-role="footer" h1Footer/h1 /footer /section !-- end second page -- !-- begin third page -- section id="page3" data-role="page" header data-role="header" h1jQuery Mobile/h1 /header div data-role="content" class="content" pThird page!/p pWelcome to my first mobile site./p pTry me on all of your mobile devices! You can use anystrongvalid HTML/strong on this page/p img src="images/alcatraz.jpg" alt="alcatraz" / p style="text-align:center;"Powered by jQuery Mobile/p pa href="#page1" data-role="button"Go back to First Page/a /p /div footer data-role="footer" h1Footer/h1 /footer /section !-- end third page -- /body /html