I have a Ajax heavy application that may have a URL such as
http://example.com/myApp/#page=1
When a user manipulates the site, the address bar can change to something like
http://example.com/myApp/#page=5
without reloading the page.
My problem is the following sequence:
- A user bookmarks the first URL.
- The user manipulates the application such that the second URL is the current state.
- The user clicks on the bookmark created in step 1.
- The URL in the address bar changes from http://example.com/myApp/#page=5 to http://example.com/myApp/#page=1, but I don't know of a way to detect the change happened.
If I detect a change some JavaScript would act on it.
-
I'm curious, why was the app designed like this? I can't see any actual need for the URL change.Vinko Vrsalovic– Vinko Vrsalovic2009年12月18日 22:07:20 +00:00Commented Dec 18, 2009 at 22:07
-
It works just like a query string, but doesn't cause the browser to reload the page. This is was done, so that the payload of the client doesn't have to be retrieved and loaded every time a page is changed. The payload is not easily cached, demands a substantial JavaScript initialization time, and would not provide the client with a seemless experience.JoshNaro– JoshNaro2009年12月21日 15:06:11 +00:00Commented Dec 21, 2009 at 15:06
4 Answers 4
HTML5 introduces a hashchange event which allows you to register for notifications of url hash changes without polling for them with a timer.
It it supported by all major browsers (Firefox 3.6, IE8, Chrome, other Webkit-based browsers), but I'd still highly suggest to use a library which handles the event for you - i.e. by using a timer in browsers not supporting the HTML5 event and using the event otherwise.
window.onhashchange = function() {
alert("hashtag changed");
};
For further information on the event, see https://developer.mozilla.org/en/dom/window.onhashchange and http://msdn.microsoft.com/en-us/library/cc288209%28VS.85%29.aspx.
check the current address periodically using setTimeout/interval:
var oldLocation = location.href;
setInterval(function() {
if(location.href != oldLocation) {
// do your action
oldLocation = location.href
}
}, 1000); // check every second
8 Comments
You should extend the location object to expose an event that you can bind to.
ie:
window.location.prototype.changed = function(e){};
(function() //create a scope so 'location' is not global
{
var location = window.location.href;
setInterval(function()
{
if(location != window.location.href)
{
location = window.location.href;
window.location.changed(location);
}
}, 1000);
})();
window.location.changed = function(e)
{
console.log(e);//outputs http://newhref.com
//this is fired when the window changes location
}
SWFaddress is an excellent library for these types of things.