Skip to content

Instantly share code, notes, and snippets.

@jzaefferer
Forked from mataspetrikas/gist:811849
Created February 17, 2011 10:54
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jzaefferer/831492 to your computer and use it in GitHub Desktop.
Save jzaefferer/831492 to your computer and use it in GitHub Desktop.
// Backbone.history with HTML5 support
(function() {
var loc = window.location,
pushSupport = !!(window.history && window.history.pushState),
hashStrip = /^#*/;
// add HTML5 support to Backbone.history, drop the old IE stuff
_.extend(Backbone.History.prototype, {
getFragment : function(l) {
l = l || window.location;
if (pushSupport){
return l.pathname;
} else {
return l.hash.replace(hashStrip, '') || "/";
}
},
start : function() {
if (pushSupport) {
// modern browsers
$(window).bind('popstate', this.checkUrl);
} else if ('onhashchange' in window) {
// older browsers without pushState support
if (loc.pathname === "/") {
$(window).bind('hashchange', this.checkUrl);
} else {
// automatically redirect browsers to the BB-readable path
var hashPath = "/#" + loc.pathname;
loc.replace(hashPath);
return;
}
}
return this.loadUrl();
},
saveLocation : function(fragment) {
//alert("new fragment: " + fragment)
fragment = (fragment || '').replace(hashStrip, '');
if (this.fragment == fragment)
return;
if (pushSupport) {
this.fragment = fragment;
history.pushState({
ts: new Date().getTime()
}, document.title, loc.protocol + "//" + loc.host + fragment);
} else {
window.location.hash = this.fragment = fragment;
}
// pass along fragment, as pushState seems to be async on Android
this.loadUrl(fragment);
},
loadUrl : function(fragment) {
fragment = this.fragment = (fragment || this.getFragment());
var matched = _.any(this.handlers, function(handler) {
if (handler.route.test(fragment)) {
handler.callback(fragment);
return true;
}
});
return matched;
}
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment