X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/0494b8d9b9bb03ab6c22b34dae81261e3cd7e3e6..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/src/util/History.js diff --git a/src/util/History.js b/src/util/History.js index 47be92d6..f06d1cd3 100644 --- a/src/util/History.js +++ b/src/util/History.js @@ -1,41 +1,51 @@ -/*! - * Ext JS Library 3.3.1 - * Copyright(c) 2006-2010 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ /** - * @class Ext.History - * @extends Ext.util.Observable + * @class Ext.util.History * History management component that allows you to register arbitrary tokens that signify application * history state on navigation actions. You can then handle the history {@link #change} event in order * to reset your application UI to the appropriate state when the user navigates forward or backward through * the browser history stack. * @singleton */ -Ext.History = (function () { - var iframe, hiddenField; - var ready = false; - var currentToken; - - function getHash() { - var href = location.href, i = href.indexOf("#"); +Ext.define('Ext.util.History', { + singleton: true, + alternateClassName: 'Ext.History', + mixins: { + observable: 'Ext.util.Observable' + }, + + constructor: function() { + var me = this; + me.oldIEMode = Ext.isIE6 || Ext.isIE7 || !Ext.isStrict && Ext.isIE8; + me.iframe = null; + me.hiddenField = null; + me.ready = false; + me.currentToken = null; + }, + + getHash: function() { + var href = window.location.href, + i = href.indexOf("#"); + return i >= 0 ? href.substr(i + 1) : null; - } + }, - function doSave() { - hiddenField.value = currentToken; - } + doSave: function() { + this.hiddenField.value = this.currentToken; + }, + - function handleStateChange(token) { - currentToken = token; - Ext.History.fireEvent('change', token); - } + handleStateChange: function(token) { + this.currentToken = token; + this.fireEvent('change', token); + }, + + updateIFrame: function(token) { + var html = '
this
reference) in which the callback is executed. Defaults to the browser window.
- */
- init: function (onReady, scope) {
- if(ready) {
- Ext.callback(onReady, scope, [this]);
- return;
- }
- if(!Ext.isReady){
- Ext.onReady(function(){
- Ext.History.init(onReady, scope);
- });
- return;
- }
- hiddenField = Ext.getDom(Ext.History.fieldId);
- if (Ext.isIE) {
- iframe = Ext.getDom(Ext.History.iframeId);
- }
- this.addEvents(
- /**
- * @event ready
- * Fires when the Ext.History singleton has been initialized and is ready for use.
- * @param {Ext.History} The Ext.History singleton.
- */
- 'ready',
- /**
- * @event change
- * Fires when navigation back or forwards within the local page's history occurs.
- * @param {String} token An identifier associated with the page state at that point in its history.
- */
- 'change'
- );
- if(onReady){
- this.on('ready', onReady, scope, {single:true});
- }
- startUp();
- },
-
- /**
- * Add a new token to the history stack. This can be any arbitrary value, although it would
- * commonly be the concatenation of a component id and another id marking the specifc history
- * state of that component. Example usage:
- *
+
+ },
+
+ /**
+ * The id of the hidden field required for storing the current history token.
+ * @type String
+ * @property
+ */
+ fieldId: Ext.baseCSSPrefix + 'history-field',
+ /**
+ * The id of the iframe required by IE to manage the history stack.
+ * @type String
+ * @property
+ */
+ iframeId: Ext.baseCSSPrefix + 'history-frame',
+
+ /**
+ * Initialize the global History instance.
+ * @param {Boolean} onReady (optional) A callback function that will be called once the history
+ * component is fully initialized.
+ * @param {Object} scope (optional) The scope (this
reference) in which the callback is executed. Defaults to the browser window.
+ */
+ init: function (onReady, scope) {
+ var me = this;
+
+ if (me.ready) {
+ Ext.callback(onReady, scope, [me]);
+ return;
+ }
+
+ if (!Ext.isReady) {
+ Ext.onReady(function() {
+ me.init(onReady, scope);
+ });
+ return;
+ }
+
+ me.hiddenField = Ext.getDom(me.fieldId);
+
+ if (me.oldIEMode) {
+ me.iframe = Ext.getDom(me.iframeId);
+ }
+
+ me.addEvents(
+ /**
+ * @event ready
+ * Fires when the Ext.util.History singleton has been initialized and is ready for use.
+ * @param {Ext.util.History} The Ext.util.History singleton.
+ */
+ 'ready',
+ /**
+ * @event change
+ * Fires when navigation back or forwards within the local page's history occurs.
+ * @param {String} token An identifier associated with the page state at that point in its history.
+ */
+ 'change'
+ );
+
+ if (onReady) {
+ me.on('ready', onReady, scope, {single: true});
+ }
+ me.startUp();
+ },
+
+ /**
+ * Add a new token to the history stack. This can be any arbitrary value, although it would
+ * commonly be the concatenation of a component id and another id marking the specifc history
+ * state of that component. Example usage:
+ *
// Handle tab changes on a TabPanel
tabPanel.on('tabchange', function(tabPanel, tab){
- Ext.History.add(tabPanel.id + ':' + tab.id);
+Ext.History.add(tabPanel.id + ':' + tab.id);
});
- * @param {String} token The value that defines a particular application-specific history state
- * @param {Boolean} preventDuplicates When true, if the passed token matches the current token
- * it will not save a new history step. Set to false if the same state can be saved more than once
- * at the same history stack location (defaults to true).
- */
- add: function (token, preventDup) {
- if(preventDup !== false){
- if(this.getToken() == token){
- return true;
- }
- }
- if (Ext.isIE) {
- return updateIFrame(token);
- } else {
- top.location.hash = token;
+ * @param {String} token The value that defines a particular application-specific history state
+ * @param {Boolean} preventDuplicates When true, if the passed token matches the current token
+ * it will not save a new history step. Set to false if the same state can be saved more than once
+ * at the same history stack location (defaults to true).
+ */
+ add: function (token, preventDup) {
+ var me = this;
+
+ if (preventDup !== false) {
+ if (me.getToken() === token) {
return true;
}
- },
-
- /**
- * Programmatically steps back one step in browser history (equivalent to the user pressing the Back button).
- */
- back: function(){
- history.go(-1);
- },
-
- /**
- * Programmatically steps forward one step in browser history (equivalent to the user pressing the Forward button).
- */
- forward: function(){
- history.go(1);
- },
-
- /**
- * Retrieves the currently-active history token.
- * @return {String} The token
- */
- getToken: function() {
- return ready ? currentToken : getHash();
}
- };
-})();
-Ext.apply(Ext.History, new Ext.util.Observable());
\ No newline at end of file
+
+ if (me.oldIEMode) {
+ return me.updateIFrame(token);
+ } else {
+ window.top.location.hash = token;
+ return true;
+ }
+ },
+
+ /**
+ * Programmatically steps back one step in browser history (equivalent to the user pressing the Back button).
+ */
+ back: function() {
+ window.history.go(-1);
+ },
+
+ /**
+ * Programmatically steps forward one step in browser history (equivalent to the user pressing the Forward button).
+ */
+ forward: function(){
+ window.history.go(1);
+ },
+
+ /**
+ * Retrieves the currently-active history token.
+ * @return {String} The token
+ */
+ getToken: function() {
+ return this.ready ? this.currentToken : this.getHash();
+ }
+});
\ No newline at end of file