Following are the basic parts to enable the navigation system described in Navigational aid. You can also download the example from Mobinav example files.
Figure: File structure for the navigational aid files
Initialize the funtions.
window.onload = function () { generateMobinav(); createToggleableContent(); }
Set the initial state of Mobinav to off.
var mobinavState = "off";
Generate a small collection of quick links that are constructed from the document headings and links contained in the navigation.
// Fetch multiple elements, sort them, // and return them in an array. function getElementsByTagNames(list,obj) { if (!obj) var obj = document; var tagNames = list.split(','); var resultArray = new Array(); for (var i=0;i<tagNames.length;i++) { var tags = obj.getElementsByTagName(tagNames[i]); for (var j=0;j<tags.length;j++) { resultArray.push(tags[j]); } } var testNode = resultArray[0]; if (!testNode) return []; if (testNode.sourceIndex) { resultArray.sort(function (a,b) { return a.sourceIndex - b.sourceIndex; }); } else if (testNode.compareDocumentPosition) { resultArray.sort(function (a,b) { return 3 - (a.compareDocumentPosition(b) & 6); }); } return resultArray; }
Generate the Mobinav icon and link that mobile device users select to launch the Movinav menu and place the icon into the document.
function generateMobinav() { if(document.getElementById && document.getElementsByName) { // Create container div for all elements inside Mobinav var mobinav = document.createElement('div'); mobinav.id = 'mobinav'; // Create the Mobinav icon and link var mobinavLink = document.createElement('a'); mobinavLink.href = "#"; mobinavLink.onclick = toggleMobinav; mobinavLink.innerHTML = "Naviagate"; mobinavLink.style.margin = "0 0 0 1px"; mobinavLink.id = "mobinavToggleLink"; mobinav.appendChild(mobinavLink); // Create the containing div var base = document.createElement('div'); base.id = "mobinavContent"; var headings = getElementsByTagNames('h2,h3,h4,h5'); // Generate quick links based on navigation var links = document.getElementById('navigation').getElementsByTagName('a'); var linkList = document.createElement('ol'); linkList.className = "navList"; // Go through navigation links and generate corresponding links for(i = 0; i < links.length; i++) { var linkEntry = document.createElement('li'); linkEntry.className = "navLink"; var link = document.createElement('a'); link.innerHTML = links[i].innerHTML; link.href = links[i].href; linkEntry.appendChild(link); linkList.appendChild(linkEntry); } // Generate table of contents based on document headings var linkList2 = document.createElement('ol'); linkList2.className = "mobinavList"; // Go through headings and generate corresponding links for(i = 0; i < headings.length; i++) { var linkEntry = document.createElement('li'); linkEntry.className = "mobinavLink"; var link = document.createElement('a'); link.innerHTML = headings[i].innerHTML; linkEntry.appendChild(link); linkList2.appendChild(linkEntry); var headerId = headings[i].id || 'link' + i; link.href = '#' + headerId; link.onclick = toggleMobinav; headings[i].id = headerId; } // Append the link lists to the containing div base.appendChild(linkList); base.appendChild(linkList2); mobinav.appendChild(base); // Append the containing div to body document.getElementsByTagName('body')[0].appendChild(mobinav); } }
Show and hide the Mobinav icon and link based on the state.
function toggleMobinav() { if(mobinavState == "on") { document.getElementById("mobinavContent").style.display = "none"; mobinavState = "off"; } else { document.getElementById("mobinavContent").style.display = "block"; mobinavState = "on"; } }
Website style sheet.
/* Common */ html, body { margin: 0; padding: 0; } .hidden { display: none; } /* Typography */ body { font-size:62.5%; font-family: "Lucida Grande", Trebuchet, Arial, Verdana, sans-serif; color: #555555; } h1 { display: block; width: 209px; height: 44px; margin: 15px 0 0 5px; padding: 0; background: #fff url('../pics/logo_example.gif') no-repeat top left; } h1 span { display: none; } h2 { margin: 15px; padding: 0; font-size: 1.6em; font-weight: bold; color: #333333; background: transparent; } p { margin: 0 15px 15px 15px; padding: 0; font-size: 1.2em; } /* Layout Elements */ body { background: #fff url('../pics/bg_main_gradient.gif') repeat-x top left; } div#container { position: relative; width: 715px; margin: 0 auto 0 auto; padding: 0; } ul#navigation { float: left; display: inline; width: 705px; list-style: none; margin: 6px 5px 0 5px; padding: 0; background: #565656 url('../pics/bg_navigation.gif') repeat-x top left; } ul#navigation li { float: left; width: 70px; margin: 0; padding: 0; } ul#navigation a { display: block; height: 20px; margin: 0; padding: 10px 10px 0 10px; font-size: 1.1em; color: #fff; text-decoration: none; text-align: center; } ul#navigation a:hover { font-weight: bold; background: #565656 url('../pics/bg_navigation.gif') repeat-x 0px -30px; } ul#navigation .active { background: #44567a url('../pics/bg_navigation_active.gif') repeat-x top left; } ul#navigation .active:hover { background: #44567a url('../pics/bg_navigation_active.gif') repeat-x top left; } div#content { float: left; width: 705px; margin: 0; padding: 0 5px 0 5px; background: #fff url('../pics/bg_main_shadow.gif') no-repeat top left; } div#content div#header { width: 705px; height: 140px; margin: 1px 0 0 0; padding: 0; background: #fff url('../pics/gfx_header.jpg') no-repeat top left; }
Mobinav style sheet.
/* Mobinav Stylesheet */ #mobinav { position: absolute; top: 0; left: 5px; padding: 1px; } #mobinavToggleLink { color: #fff; padding: 2px 2px 2px 12px; background: #000000 url('../pics/mobinav.gif') no-repeat center left; } #mobinav a { color: #fff; text-decoration: none; } #mobinavContent { margin: 0; padding: 0; display: none; } #mobinavContent ol { margin: 0; padding: 0; list-style: none; } #mobinavContent .navList { background: #933a3a; } #mobinavContent .mobinavList { background: #3a7b93; } #mobinavContent li { margin: 0 0 0 20px; padding: 0 0 0 14px; } #mobinavContent .navLink { background: #501b1b url('../pics/gfx_external_link.gif') no-repeat center left; } #mobinavContent .navLink:hover { background: #732727 url('../pics/gfx_external_link.gif') no-repeat center left; } #mobinavContent .navLink a:hover { background: #732727; } #mobinavContent .mobinavLink { background: #1b3950; font-style: italic; } #mobinavContent .mobinavLink:hover { background: #275070; } #mobinavContent .mobinavLink a:hover { background: #275070; } #mobinavContent a { display: block; margin: 0; padding: 0.5em; color: #fff; text-decoration: none; }
Index page.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <head> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <meta name="author" content="Nokia"> <meta name="description" content="This example site illustrates the use of a navigational aid for mobile devices."> <meta name="keywords" content="S60, browser, mobile, browsing"> <title>Navigational aid - Main</title> <link rel="stylesheet" href="styles/main.css" type="text/css" media="all"> <link rel="stylesheet" href="styles/mobinav.css" type="text/css" media="all"> <link rel="shortcut icon" href="pics/favicon.gif" type="image/x-icon"> <link rel="icon" href="pics/favicon.gif" type="image/x-icon"> <script type="text/javascript" src="scripts/common.js"></script> </head> <body> <div id="container"> <h1><span>Navigational aid for mobile devices</span></h1> <ul id="navigation"> <li><a href="index.html" class="active">Home</a></li><li><a href="Page1.html">Page 1</a></li> <li><a href="Page2.html">Page 2</a></li> <li><a href="Page3.html">Page 3</a></li> </ul> <div id="content"><div id="header"> </div> <h2>Index page</h2> <p>Index page paragraph text</p> </body> </html>
Pages 1, 2, and 3 are the same except
for the list item that has JavaScript applied to highlight it (<li><a
href="Page1.html" class="active">Page 1</a></li>
).
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <head> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <meta name="author" content="Nokia"> <meta name="description" content="This example site illustrates the use of a navigational aid for mobile devices."> <meta name="keywords" content="S60, browser, mobile, browsing"> <title>Navigational aid - Page 1</title> <link rel="stylesheet" href="styles/main.css" type="text/css" media="all"> <link rel="stylesheet" href="styles/mobinav.css" type="text/css" media="all"> <link rel="shortcut icon" href="pics/favicon.gif" type="image/x-icon"> <link rel="icon" href="pics/favicon.gif" type="image/x-icon"> <script type="text/javascript" src="scripts/common.js"></script> </head> <body> <div id="container"> <h1><span>Navigational aid for mobile devices</span></h1> <ul id="navigation"> <li><a href="index.html">Home</a></li> <li><a href="Page1.html" class="active">Page 1</a></li> <li><a href="Page2.html">Page 2</a></li> <li><a href="Page3.html">Page 3</a></li> </ul> <div id="content"> <h2>Page 1</h2> <p>Page 1 paragraph text</p> </body> </html>
Page 2 is the same as Page 1 except for the JavaScript applied to make the Page 2 list item active.
<body> <div id="container"> <h1><span>Navigational aid for mobile devices</span></h1> <ul id="navigation"> <li><a href="index.html">Home</a></li> <li><a href="Page1.html">Page 1</a></li> <li><a href="Page2.html" class="active">Page 2</a></li> <li><a href="Page3.html">Page 3</a></li> </ul> <div id="content"> <h2>Page 2</h2> <p>Page 2 paragraph text</p> </body>
Page 3 is the same as Page 1 except for the JavaScript applied to make the Page 3 list item active.
<body> <div id="container"> <h1><span>Navigational aid for mobile devices</span></h1> <ul id="navigation"> <li><a href="index.html">Home</a></li> <li><a href="Page1.html">Page 1</a></li> <li><a href="Page2.html">Page 2</a></li> <li><a href="Page3.html" class="active">Page 3</a></li> </ul> <div id="content"> <h2>Page 3</h2> <p>Page 3 paragraph text</p> </body>