• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * jQuery history event v0.1
3 * Copyright (c) 2008 Tom Rodenberg <tarodenberg gmail com>
4 * Licensed under the GPL (http://www.gnu.org/licenses/gpl.html) license.
5 */
6(function($) {
7    var currentHash, previousNav, timer, hashTrim = /^.*#/;
8
9    var msie = {
10        iframe: null,
11        getDoc: function() {
12            return msie.iframe.contentWindow.document;
13        },
14        getHash: function() {
15            return msie.getDoc().location.hash;
16        },
17        setHash: function(hash) {
18            var d = msie.getDoc();
19            d.open();
20            d.close();
21            d.location.hash = hash;
22        }
23    };
24
25    var historycheck = function() {
26        var hash = msie.iframe ? msie.getHash() : location.hash;
27        if (hash != currentHash) {
28            currentHash = hash;
29            if (msie.iframe) {
30                location.hash = currentHash;
31            }
32            var current = $.history.getCurrent();
33            $.event.trigger('history', [current, previousNav]);
34            previousNav = current;
35        }
36    };
37
38    $.history = {
39        add: function(hash) {
40            hash = '#' + hash.replace(hashTrim, '');
41            if (currentHash != hash) {
42                var previous = $.history.getCurrent();
43                location.hash = currentHash = hash;
44                if (msie.iframe) {
45                    msie.setHash(currentHash);
46                }
47                $.event.trigger('historyadd', [$.history.getCurrent(), previous]);
48            }
49            if (!timer) {
50                timer = setInterval(historycheck, 100);
51            }
52        },
53        getCurrent: function() {
54            if (currentHash) {
55              return currentHash.replace(hashTrim, '');
56            } else {
57              return "";
58            }
59        }
60    };
61
62    $.fn.history = function(fn) {
63        $(this).bind('history', fn);
64    };
65
66    $.fn.historyadd = function(fn) {
67        $(this).bind('historyadd', fn);
68    };
69
70    $(function() {
71        currentHash = location.hash;
72        if ($.browser.msie) {
73            msie.iframe = $('<iframe style="display:none" src="javascript:false;"></iframe>').prependTo('body')[0];
74            msie.setHash(currentHash);
75            currentHash = msie.getHash();
76        }
77    });
78})(jQuery);
79