JQuery Mobile App: Caching Pages in local Storage Seamlessly
While JQuery Mobile provides a way to cache and prefetch pages and store them in DOM, it does not provide a seamless mechanism to persist these pages in local storage. Local Storage a mechanism introduced in HTML5 to store data locally in the browser and remains persisted between browser sessions.
The mechanism below has been tested with Jquery Mobile 1.2 . The process works as below:
- Intercept “pagebeforechange” event to find out if the page is already in DOM or cache.
- If not in DOM or Cache – do nothing- continue as usual
- If in cache but not in DOM, put the data in DOM so that the loadPage automatically finds it.
- Now Intercept “pageload” event to populate the localStorage cache.
- The example only cache the pages (pages with data-role=”page”) and with attribute “data-local-storage=true“
Here’s the code:
$(document).bind( "pagebeforechange", function( e, data ) { if ( typeof data.toPage === "string" ) { var pageId = getPageId(data.toPage); if(localStorage.getItem(pageId) == null) { } else { if($("#" + pageId) == null || $("#" + pageId).length == 0) { var html = localStorage.getItem(pageId); var all = $( "<div></div>" ); all.get( 0 ).innerHTML = html; page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); var u = data.toPage; if($.mobile.path.isAbsoluteUrl(u)) { u = u.substring($.mobile.path.parseUrl(u).domain.length); } page.attr("data-url", u); $('body').append(page); } } } }); $( document ).bind( "pageload", function( event, data ){ console.log(data.xhr.responseText); var pageId = getPageId(data.dataUrl); if(data.xhr.responseText != null) { var all = $( "<div></div>" ); all.get( 0 ).innerHTML = data.xhr.responseText; var page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); if(page.jqmData("local-cache") === true) { localStorage.setItem(pageId, data.xhr.responseText); } } });
Leave a Comment