To achieve this effect we’ll use the History Web API. In a nutshell, this API is used to alter the browser history. It allows us to load a new URL, change the page title, then at the same time record it as a new visit in the browser without having to actually load the page.
This sounds confusing, but it opens up a number of possibilities–such as being able to serve smoother page transitions and give a sense of speediness which improves the user experience. You have probably already witnessed the Web History API in action on a number of websites and web applications, such as Trello, Quartz, and Privacy.
The rather abstract (and rather nice) Quartz website |
The History Web API, in Brief
To access the Web History API, we first write window.history then follow this with one of the APIs; a method or a property. In this tutorial we’ll be focusing on the pushState() method, so:
- window.history.pushState( state, title, url );
- The first parameter, state, should be an object containing arbitrary data. This data will then be accessible through window.history.state. In a real world application, we would pass data like a page ID, a URL, or serialized inputs derived from a form.
- The last two parameters are title and
- url. These two change the URL and the document title in the browser, as well as record them as a new entry in the browser history.
- (function( $ ){
- $( "a" ).on( "click", function( event ) {
- event.preventDefault();
- window.history.pushState( { ID: 9 }, "About - Acme", "about/" );
- } );
- })( jQuery );
From top to bottom: Chrome, Firefox, Opera. |
However, all the browsers in this example are currently ignoring the title parameter. You can see from the screenshot the document does not change to About - Acme as specified. Furthermore, calling the pushState() method won’t also trigger the popstate event; an event which is dispatched every time the history changes–something we need! There are a few discrepancies on how browsers handle this event, as stated in MDN:
“Browsers tend to handle the popstate event differently on page load. Chrome (prior to v34) and Safari always emit a popstate event on page load, but Firefox doesn’t.”We will need a library as a fallback to make the History Web APIs work consistently across the browser without any hurdles.
Meet History.js
Since the pushState() method does not work to its full potential, in this tutorial we are going to leverage History.js. As the name implies, this JavaScript library is a polyfill, replicating the native History APIs that work across different browsers. It also exposes a set of methods similar to the native APIs, albeit with few differences.
As mentioned earlier, the browser native API is called through the history window object with the lowercase “h”, while the History.js API is accessed through History with the uppercase “H”. Given the previous example and assuming we have the history.js file loaded, we can revise the code, as follows (again, notice the uppercase “H”).
- window.History.pushState( {}, title, url );
- History API
- Manipulating the Browser History
- An Introduction to the HTML5 History
In this section we won’t discuss each step needed to build a static website in detail. Our website is plain simple, as shown in the following screenshot:
The Website Homepage |
- Load jQuery and History.js within the document head. You may load it as a project dependency through Bower, or through a CDN like CDNJS or JSDelivr.
- Wrap the header, the content, and footer in a div with the ID wrap; <div id="wrap"></div>
- There are a few navigation items on the website header and the footer. Each menu should be pointing to a page. Make sure the pages exist and have content.
- Each menu link is given page-link class which we will use for selecting these menus.
- Lastly, we give each link a title attribute which we’ll pass to pushState() to determine the document title.
- <head>
- <script src="jquery.js"></script>
- <script src="history.js"></script>
- </head>
- <body>
- <div id="wrap">
- <header>
- <nav>
- <ul>
- <li><a class="page-link" href="./" title="Acme">Home</a></li>
- <li><a class="page-link" href="./about.html" title="About Us">About</a></li>
- <!-- more menu -->
- </ul>
- </nav>
- </header>
- <div>
- <!-- content is here -->
- </div>
- <footer>
- <nav>
- <ul>
- <li><a href="tos.html" class="page-link" title="Terms of Service">Terms</a></li>
- <!-- more menu -->
- </ul>
- </nav>
- <!-- this is the footer -->
- </footer>
- </div>
- </body>
(continue)
If you found this post interesting, follow and support us.
Suggest for you:
Vue.JS Tutorials: Zero to Hero with VueJS JavaScript Framework
Learning ECMAScript 6: Moving to the New JavaScript
Closure Library: Build Complex JavaScript Applications
JavaScript Promises: Applications in ES6 and AngularJS
JavaScript For Absolute Beginners - Build Simple Projects
No comments:
Post a Comment