/** * jQuery history event v0.1 * Copyright (c) 2008 Tom Rodenberg * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license. */ (function($) { var currentHash, previousNav, timer, hashTrim = /^.*#/; var msie = { iframe: null, getDoc: function() { return msie.iframe.contentWindow.document; }, getHash: function() { return msie.getDoc().location.hash; }, setHash: function(hash) { var d = msie.getDoc(); d.open(); d.close(); d.location.hash = hash; } }; var historycheck = function() { var hash = msie.iframe ? msie.getHash() : location.hash; if (hash != currentHash) { currentHash = hash; if (msie.iframe) { location.hash = currentHash; } var current = $.history.getCurrent(); $.event.trigger('history', [current, previousNav]); previousNav = current; } }; $.history = { add: function(hash) { hash = '#' + hash.replace(hashTrim, ''); if (currentHash != hash) { var previous = $.history.getCurrent(); location.hash = currentHash = hash; if (msie.iframe) { msie.setHash(currentHash); } $.event.trigger('historyadd', [$.history.getCurrent(), previous]); } if (!timer) { timer = setInterval(historycheck, 100); } }, getCurrent: function() { if (currentHash) { return currentHash.replace(hashTrim, ''); } else { return ""; } } }; $.fn.history = function(fn) { $(this).bind('history', fn); }; $.fn.historyadd = function(fn) { $(this).bind('historyadd', fn); }; $(function() { currentHash = location.hash; if ($.browser.msie) { msie.iframe = $('').prependTo('body')[0]; msie.setHash(currentHash); currentHash = msie.getHash(); } }); })(jQuery);