Cross Browser Hash Change Event

http://www.dte.web.id

by Taufik Nurrohman

HTML

<p>Hit the links below... Also try to press back and forward buttons on the browser you are using (after you click on the links below).</p>
<p>
<a href="#hash-1">Link 1</a>

<a href="#hash-2">Link 2</a>

<a href="#hash-3">Link 3</a>

<a href="#hash-4">Link 4</a>

</p>

JavaScript

// http://stackoverflow.com/questions/9339865/get-the-hashchange-event-to-work-in-all-browsers-including-ie7
(function (w) {
    if ('onhashchange' in w) {
        if (w.addEventListener) {
            w.addHashChange = function (func, before) {
                w.addEventListener('hashchange', func, before);
            };
            w.removeHashChange = function (func) {
                w.removeEventListener('hashchange', func);
            };
            return;
        } else if (w.attachEvent) {
            w.addHashChange = function (func) {
                w.attachEvent('onhashchange', func);
            };
            w.removeHashChange = function (func) {
                w.detachEvent('onhashchange', func);
            };
            return;
        }
    }
    var hashChangeFuncs = [],
        oldHref = location.href;
    w.addHashChange = function (func, before) {
        if (typeof func === 'function') hashChangeFuncs[before ? 'unshift' : 'push'](func);
    };
    w.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) {
            oldHref = newHref;
            for (var i = 0; i < hashChangeFuncs.length; i++) {
                hashChangeFuncs[i].call(w, {
                    'type': 'hashchange',
                        'newURL': newHref,
                        'oldURL': oldHref
                });
            }
        }
    }, 100);
})(window);

window.addHashChange(function (e) {
    alert(e.newURL);
});