Kleiner Hinweis: Dieser Blogpost nimmt an, das jQuery verwendet wird 😉
Dank AJAX kann man eine Menge Traffic einsparen – allerdings hat AJAX leider ein paar Nachteile: Die Browsernavigation, also die „Vor“ und „Zurück“ Knöpfe des Browsers, funktionieren nicht mehr.
Hier mal ein Beispiel:
HTML:
Inhalt ändernHier ist Inhalt 1
JavaScript:
$("a").live("click", function (e) { e.preventDefault(); $('#content').load(e.target.href, function() { // nothing here yet ;) }); });
Klickt man nun auf „Inhalt ändern“, erscheint der Inhalt von content.html im content-div. Wenn jetzt der Benutzer allerdings wieder „Hier ist Inhalt 1“ sehen möchte, kann er nicht den „Zurück“-Button seines Browsers verwenden.
Um dieses Problem zu lösen gibt es zwei Möglichkeiten:
- Einen hash an die aktuelle URL anhängen, etwa so: /#!content.html
- Das HTML5 window.history-Objekt bemühen
Da die zweite Methode leider (noch) nicht von jedem Browser unterstützt wird, aber die wesentlich hübschere Methode ist, habe ich mir ein Objekt geschrieben, was beides kann!
/** * navigatorHistory * * Fixes navigator history for ajax-based sites * * @author agrafix */ var navigatorHistory = { /** * Title of site */ siteTitle: '', /** * function to load content, needs to be set before hook()-call */ loaderFunc: null, /** * check if the browser supports pushState */ isSupported : function() { return (typeof (window.history.pushState) == 'function'); }, /** * add url to history */ add : function(url) { if (this.isSupported()) { window.history .pushState(null, this.siteTitle, url); } else { window.location.hash = "#!" + url; } }, /** * listen for back-forward button events */ hook : function() { if (!this.loaderFunc) { alert("No loaderFunc defined!"); return; } if (this.isSupported()) { // doesn't work with jquery, no idea why :O window.addEventListener("popstate", function(e) { navigatorHistory.loaderFunc(document.location.pathname, true); }); } else { $(window).bind('hashchange', function() { var location = (window.location.hash).replace(/^#!/, ''); navigatorHistory.loaderFunc(location, true); }); } } };
Die Benutzung in Verbindung mit dem obigen HTML-Schnipsel ist denkbar einfach:
// funktion zum laden der Seiten definieren navigatorHistory.loaderFunc = function(url, nohistory) { if (!nohistory) { navigatorHistory.add(url); } $('#content').load(url); }; // seiten titel navigatorHistory.siteTitle = "Deine Seite"; // auf vor bzw. zurück-button klicks hören navigatorHistory.hook(); // die eigentliche ajax-funktion $("a").live("click", function (e) { e.preventDefault(); navigatorHistory.loaderFunc(e.target.href); });
Eigentlich relativ einfach einzubauen und es macht eine Seite deutlich benutzerfreundlicher!