X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/6a7e4474cba9d8be4b2ec445e10f1691f7277c50..3789b528d8dd8aad4558e38e22d775bcab1cbd36:/src/util/History.js diff --git a/src/util/History.js b/src/util/History.js index 5a6f3cf1..cfbdedaa 100644 --- a/src/util/History.js +++ b/src/util/History.js @@ -1,41 +1,69 @@ -/*! - * Ext JS Library 3.2.0 - * Copyright(c) 2006-2010 Ext JS, Inc. - * licensing@extjs.com - * http://www.extjs.com/license - */ /** - * @class Ext.History - * @extends Ext.util.Observable - * 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. + * @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. + +__Initializing__ +The {@link #init} method of the History object must be called before using History. This sets up the internal +state and must be the first thing called before using History. + +__Setup__ +The History objects requires elements on the page to keep track of the browser history. For older versions of IE, +an IFrame is required to do the tracking. For other browsers, a hidden field can be used. The history objects expects +these to be on the page before the {@link #init} method is called. The following markup is suggested in order +to support all browsers: + +
+ + * @markdown * @singleton */ -Ext.History = (function () { - var iframe, hiddenField; - var ready = false; - var currentToken; - - function getHash() { - var href = top.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) {
+ 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();
+ },
- return {
- /**
- * The id of the hidden field required for storing the current history token.
- * @type String
- * @property
- */
- fieldId: 'x-history-field',
- /**
- * The id of the iframe required by IE to manage the history stack.
- * @type String
- * @property
- */
- iframeId: 'x-history-frame',
-
- events:{},
-
- /**
- * 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) {
- 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:
- *
+ /**
+ * 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