1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/** 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * jQuery history event v0.1 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com> 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license. 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson(function($) { 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var currentHash, previousNav, timer, hashTrim = /^.*#/; 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var msie = { 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson iframe: null, 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson getDoc: function() { 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return msie.iframe.contentWindow.document; 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }, 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson getHash: function() { 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return msie.getDoc().location.hash; 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }, 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson setHash: function(hash) { 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var d = msie.getDoc(); 19920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson d.open(); 20920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson d.close(); 21920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson d.location.hash = hash; 22920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 24920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 25920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var historycheck = function() { 26920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var hash = msie.iframe ? msie.getHash() : location.hash; 27920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (hash != currentHash) { 28920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson currentHash = hash; 29920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (msie.iframe) { 30920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson location.hash = currentHash; 31920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var current = $.history.getCurrent(); 33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $.event.trigger('history', [current, previousNav]); 34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson previousNav = current; 35920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $.history = { 39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson add: function(hash) { 40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson hash = '#' + hash.replace(hashTrim, ''); 41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (currentHash != hash) { 42920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson var previous = $.history.getCurrent(); 43920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson location.hash = currentHash = hash; 44920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (msie.iframe) { 45920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson msie.setHash(currentHash); 46920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 47920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $.event.trigger('historyadd', [$.history.getCurrent(), previous]); 48920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 49920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (!timer) { 50920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson timer = setInterval(historycheck, 100); 51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }, 53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson getCurrent: function() { 54920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if (currentHash) { 55920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return currentHash.replace(hashTrim, ''); 56920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } else { 57920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return ""; 58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 62920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $.fn.history = function(fn) { 63920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $(this).bind('history', fn); 64920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 65920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 66920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $.fn.historyadd = function(fn) { 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $(this).bind('historyadd', fn); 68920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }; 69920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 70920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson $(function() { 71920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson currentHash = location.hash; 72920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson if ($.browser.msie) { 73920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0]; 74920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson msie.setHash(currentHash); 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson currentHash = msie.getHash(); 76920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson }); 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson})(jQuery); 79