jquery-ui/ui/ui.history.js

113 lines
3.7 KiB
JavaScript
Raw Normal View History

/*
* jQuery UI History
*
* Copyright (c) 2008 Klaus Hartl (stilbuero.de)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* http://docs.jquery.com/UI/History
*
* Depends:
* ui.core.js
*/
(function($) {
// TODO lazy loading singleton
$.ui.hmanager = new function() {
var states = {}, def = function() {};
var $window = $(window), hash = location.hash;
function getState() {
return hash.replace('#', '');
}
var iframe;
// var keepHistoryIn = iframe || window;
return {
enable: function() {
if ($.browser.msie && parseInt($.browser.version) < 8) {
$(function() {
// create hidden iframe for hash change tracking
iframe = $('<iframe id="ui-history-iframe" style="display: none;"></iframe>').
prependTo(document.body)[0];
// create initial history entry
iframe.contentWindow.document.open();
iframe.contentWindow.document.close();
if (getState())
iframe.contentWindow.document.location.hash = getState();
});
}
$window.bind('hashchange', function(e) {
// Prevent IE 8 from fireing an event twice,
// one from true event, one from trigger...
if (!iframe && hash == location.hash || iframe && hash == iframe.contentWindow.document.location.hash)
return false;
if ($.browser.msie && parseInt($.browser.version) < 8) {
hash = iframe.contentWindow.document.location.hash;
}
else
hash = location.hash;
if (getState())
states[getState()]();
else
// TODO invoke default
;
});
if (!($.browser.msie && parseInt($.browser.version) >= 8)) {
setInterval(
($.browser.msie ?
function() {
if (hash != iframe.contentWindow.document.location.hash)
$window.trigger('hashchange');
} :
function() {
if (hash != location.hash)
$window.trigger('hashchange');
else
// Do the history.length check hack for Safari 2
;
}
)
, 200
);
}
},
add: function(state, handler) {
states[state] = handler;
},
go: function(state) {
if (state) {
if ($.browser.msie && parseInt($.browser.version) < 8) {
iframe.contentWindow.document.open();
iframe.contentWindow.document.close();
iframe.contentWindow.document.location.hash = state;
}
location.hash = state;
$window.trigger('hashchange');
}
else
console.log('TODO do default state');
}
}
};
$.ui.history = function() {
var args = Array.prototype.slice.call(arguments, 1);
$.ui.hmanager[arguments[0]].apply($.ui.hmanager, args);
};
})(jQuery);