browser.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:6k
源码类别:

OA系统

开发平台:

Java

  1. /*
  2. Copyright (c) 2004-2006, The Dojo Foundation
  3. All Rights Reserved.
  4. Licensed under the Academic Free License version 2.1 or above OR the
  5. modified BSD license. For more information on Dojo licensing, see:
  6. http://dojotoolkit.org/community/licensing.shtml
  7. */
  8. dojo.provide("dojo.undo.browser");
  9. dojo.require("dojo.io.common");
  10. try {
  11. if ((!djConfig["preventBackButtonFix"]) && (!dojo.hostenv.post_load_)) {
  12. document.write("<iframe style='border: 0px; width: 1px; height: 1px; position: absolute; bottom: 0px; right: 0px; visibility: visible;' name='djhistory' id='djhistory' src='" + (djConfig["dojoIframeHistoryUrl"] || dojo.hostenv.getBaseScriptUri() + "iframe_history.html") + "'></iframe>");
  13. }
  14. }
  15. catch (e) {
  16. }
  17. if (dojo.render.html.opera) {
  18. dojo.debug("Opera is not supported with dojo.undo.browser, so back/forward detection will not work.");
  19. }
  20. dojo.undo.browser = {initialHref:(!dj_undef("window")) ? window.location.href : "", initialHash:(!dj_undef("window")) ? window.location.hash : "", moveForward:false, historyStack:[], forwardStack:[], historyIframe:null, bookmarkAnchor:null, locationTimer:null, setInitialState:function (args) {
  21. this.initialState = this._createState(this.initialHref, args, this.initialHash);
  22. }, addToHistory:function (args) {
  23. this.forwardStack = [];
  24. var hash = null;
  25. var url = null;
  26. if (!this.historyIframe) {
  27. if (djConfig["useXDomain"] && !djConfig["dojoIframeHistoryUrl"]) {
  28. dojo.debug("dojo.undo.browser: When using cross-domain Dojo builds," + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl" + " to the path on your domain to iframe_history.html");
  29. }
  30. this.historyIframe = window.frames["djhistory"];
  31. }
  32. if (!this.bookmarkAnchor) {
  33. this.bookmarkAnchor = document.createElement("a");
  34. dojo.body().appendChild(this.bookmarkAnchor);
  35. this.bookmarkAnchor.style.display = "none";
  36. }
  37. if (args["changeUrl"]) {
  38. hash = "#" + ((args["changeUrl"] !== true) ? args["changeUrl"] : (new Date()).getTime());
  39. if (this.historyStack.length == 0 && this.initialState.urlHash == hash) {
  40. this.initialState = this._createState(url, args, hash);
  41. return;
  42. } else {
  43. if (this.historyStack.length > 0 && this.historyStack[this.historyStack.length - 1].urlHash == hash) {
  44. this.historyStack[this.historyStack.length - 1] = this._createState(url, args, hash);
  45. return;
  46. }
  47. }
  48. this.changingUrl = true;
  49. setTimeout("window.location.href = '" + hash + "'; dojo.undo.browser.changingUrl = false;", 1);
  50. this.bookmarkAnchor.href = hash;
  51. if (dojo.render.html.ie) {
  52. url = this._loadIframeHistory();
  53. var oldCB = args["back"] || args["backButton"] || args["handle"];
  54. var tcb = function (handleName) {
  55. if (window.location.hash != "") {
  56. setTimeout("window.location.href = '" + hash + "';", 1);
  57. }
  58. oldCB.apply(this, [handleName]);
  59. };
  60. if (args["back"]) {
  61. args.back = tcb;
  62. } else {
  63. if (args["backButton"]) {
  64. args.backButton = tcb;
  65. } else {
  66. if (args["handle"]) {
  67. args.handle = tcb;
  68. }
  69. }
  70. }
  71. var oldFW = args["forward"] || args["forwardButton"] || args["handle"];
  72. var tfw = function (handleName) {
  73. if (window.location.hash != "") {
  74. window.location.href = hash;
  75. }
  76. if (oldFW) {
  77. oldFW.apply(this, [handleName]);
  78. }
  79. };
  80. if (args["forward"]) {
  81. args.forward = tfw;
  82. } else {
  83. if (args["forwardButton"]) {
  84. args.forwardButton = tfw;
  85. } else {
  86. if (args["handle"]) {
  87. args.handle = tfw;
  88. }
  89. }
  90. }
  91. } else {
  92. if (dojo.render.html.moz) {
  93. if (!this.locationTimer) {
  94. this.locationTimer = setInterval("dojo.undo.browser.checkLocation();", 200);
  95. }
  96. }
  97. }
  98. } else {
  99. url = this._loadIframeHistory();
  100. }
  101. this.historyStack.push(this._createState(url, args, hash));
  102. }, checkLocation:function () {
  103. if (!this.changingUrl) {
  104. var hsl = this.historyStack.length;
  105. if ((window.location.hash == this.initialHash || window.location.href == this.initialHref) && (hsl == 1)) {
  106. this.handleBackButton();
  107. return;
  108. }
  109. if (this.forwardStack.length > 0) {
  110. if (this.forwardStack[this.forwardStack.length - 1].urlHash == window.location.hash) {
  111. this.handleForwardButton();
  112. return;
  113. }
  114. }
  115. if ((hsl >= 2) && (this.historyStack[hsl - 2])) {
  116. if (this.historyStack[hsl - 2].urlHash == window.location.hash) {
  117. this.handleBackButton();
  118. return;
  119. }
  120. }
  121. }
  122. }, iframeLoaded:function (evt, ifrLoc) {
  123. if (!dojo.render.html.opera) {
  124. var query = this._getUrlQuery(ifrLoc.href);
  125. if (query == null) {
  126. if (this.historyStack.length == 1) {
  127. this.handleBackButton();
  128. }
  129. return;
  130. }
  131. if (this.moveForward) {
  132. this.moveForward = false;
  133. return;
  134. }
  135. if (this.historyStack.length >= 2 && query == this._getUrlQuery(this.historyStack[this.historyStack.length - 2].url)) {
  136. this.handleBackButton();
  137. } else {
  138. if (this.forwardStack.length > 0 && query == this._getUrlQuery(this.forwardStack[this.forwardStack.length - 1].url)) {
  139. this.handleForwardButton();
  140. }
  141. }
  142. }
  143. }, handleBackButton:function () {
  144. var current = this.historyStack.pop();
  145. if (!current) {
  146. return;
  147. }
  148. var last = this.historyStack[this.historyStack.length - 1];
  149. if (!last && this.historyStack.length == 0) {
  150. last = this.initialState;
  151. }
  152. if (last) {
  153. if (last.kwArgs["back"]) {
  154. last.kwArgs["back"]();
  155. } else {
  156. if (last.kwArgs["backButton"]) {
  157. last.kwArgs["backButton"]();
  158. } else {
  159. if (last.kwArgs["handle"]) {
  160. last.kwArgs.handle("back");
  161. }
  162. }
  163. }
  164. }
  165. this.forwardStack.push(current);
  166. }, handleForwardButton:function () {
  167. var last = this.forwardStack.pop();
  168. if (!last) {
  169. return;
  170. }
  171. if (last.kwArgs["forward"]) {
  172. last.kwArgs.forward();
  173. } else {
  174. if (last.kwArgs["forwardButton"]) {
  175. last.kwArgs.forwardButton();
  176. } else {
  177. if (last.kwArgs["handle"]) {
  178. last.kwArgs.handle("forward");
  179. }
  180. }
  181. }
  182. this.historyStack.push(last);
  183. }, _createState:function (url, args, hash) {
  184. return {"url":url, "kwArgs":args, "urlHash":hash};
  185. }, _getUrlQuery:function (url) {
  186. var segments = url.split("?");
  187. if (segments.length < 2) {
  188. return null;
  189. } else {
  190. return segments[1];
  191. }
  192. }, _loadIframeHistory:function () {
  193. var url = (djConfig["dojoIframeHistoryUrl"] || dojo.hostenv.getBaseScriptUri() + "iframe_history.html") + "?" + (new Date()).getTime();
  194. this.moveForward = true;
  195. dojo.io.setIFrameSrc(this.historyIframe, url, false);
  196. return url;
  197. }};