Get the hashchange event to work in all browsers (including IE7)
attachEvent
requires events to be prefixed withon
.- You've different capitalizations for the method. Change
hashchange
inattachEvent
tohashChange
to get the event to work in IE8. - Use the suggested implementation to support the
hashchange
implementation for IE7- and other old browsers.
I have created a cross-browser implementation, which adds the hashchange
feature to browsers, even those who do not support it. The fallback is based on the specification.
//function hashchange is assumed to exist. This function will fire on hashchangeif (!('onhashchange' in window)) { var oldHref = location.href; setInterval(function() { var newHref = location.href; if (oldHref !== newHref) { var _oldHref = oldHref; oldHref = newHref; hashChange.call(window, { 'type': 'hashchange', 'newURL': newHref, 'oldURL': _oldHref }); } }, 100);} else if (window.addEventListener) { window.addEventListener("hashchange", hashChange, false);}else if (window.attachEvent) { window.attachEvent("onhashchange", hashChange); }
Note: This code is useful for one hashchange event. If you want to add multiple hashchange
handlers, use the following method.
It defines two functions, addHashChange
and removeHashChange
. Both methods take a function as an argument.
(function() { if ('onhashchange' in window) { if (window.addEventListener) { window.addHashChange = function(func, before) { window.addEventListener('hashchange', func, before); }; window.removeHashChange = function(func) { window.removeEventListener('hashchange', func); }; return; } else if (window.attachEvent) { window.addHashChange = function(func) { window.attachEvent('onhashchange', func); }; window.removeHashChange = function(func) { window.detachEvent('onhashchange', func); }; return; } } var hashChangeFuncs = []; var oldHref = location.href; window.addHashChange = function(func, before) { if (typeof func === 'function') hashChangeFuncs[before?'unshift':'push'](func); }; window.removeHashChange = function(func) { for (var i=hashChangeFuncs.length-1; i>=0; i--) if (hashChangeFuncs[i] === func) hashChangeFuncs.splice(i, 1); }; setInterval(function() { var newHref = location.href; if (oldHref !== newHref) { var _oldHref = oldHref; oldHref = newHref; for (var i=0; i<hashChangeFuncs.length; i++) { hashChangeFuncs[i].call(window, { 'type': 'hashchange', 'newURL': newHref, 'oldURL': _oldHref }); } } }, 100);})();// Usage, infinitely many times:addHashChange(function(e){alert(e.newURL||location.href);});
attachEvent takes on two params:
bSuccess = object.attachEvent(sEvent, fpNotify)
[And is needed for all versions of IE below IE9! :( See MDN reference]
This could work:
if(window.addEventListener) { window.addEventListener("hashchange", hashChange, false);}else if (window.attachEvent) { window.attachEvent("onhashchange", hashchange);//SEE HERE... //missed the on. Fixed thanks to @Robs answer.}
Of course if it is possible, you should just use JQuery, since it encapsulates all this for your.
And as always there is a plugin out there:http://benalman.com/projects/jquery-hashchange-plugin/