U.AFB.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*
  2. 前进后退处理区域
  3. 用于场景
  4. 1、导航前进后退处理
  5. 2、记录用户步骤处理
  6. 3、url前进后退处理
  7. */
  8. Namespace.register("U.AFB");
  9. //#region 前进后退使用处理区域
  10. U.AFB.GoList = {}; //前进后退处理
  11. U.AFB.UTH = null //url处理
  12. //#endregion
  13. //#region 前进后退处理
  14. /**
  15. * 前进后退公开调用区域
  16. *
  17. * @param {string} 前进后退在指定的域
  18. * @param {boolean} 是否重新加载
  19. */
  20. U.AFB.RGoL = function (UTF, UFT) {
  21. var _UDE = U.AFB.GoList;
  22. //根据类类型 获取前进后退类
  23. if (_UDE[UTF] && UFT !== true) { //已经存在域的前进后退
  24. return _UDE[UTF].UT;
  25. }
  26. else { //创建一个新的前进后退处理
  27. return new U.AFB.init(UTF);
  28. }
  29. }
  30. /**
  31. * 注册前进后退
  32. *
  33. * @param {string} 前进后退在指定的域 如 disk 那就在disk导航
  34. */
  35. U.AFB.init = function (UTF) {
  36. /*
  37. 描述
  38. -----OF: 当前前进后退集合
  39. -----OL: 前进后退所在的位置
  40. -----UT: 当前的域
  41. */
  42. U.Ut.AddObj(this, { OF: [], OL: 0, UT: this });
  43. U.AFB.GoList[UTF] = this; //添加到集合里面
  44. }
  45. /**
  46. * 添加前进后退
  47. *
  48. * @param {function} 前进后退函数添加
  49. * @param {string} 前进后退在指定的域
  50. */
  51. U.AFB.AddEvent = function (UCB, UTF) {
  52. var _UTE = U.AFB.RGoL(UTF);
  53. UCB = U.M.apply(_UTE, UCB);
  54. _UTE.AddDrawBack(UCB); UCB(); //添加执行前进后退
  55. }
  56. /**
  57. * 添加前进后退事件
  58. *
  59. * @param {function} 前进后退函数添加
  60. */
  61. U.AFB.AddDrawBack = function (UCB) {
  62. this.OF.splice(this.OL, this.OF.length - this.OL, UCB); //添加一个前进后退时间
  63. this.OL++; //位置加一
  64. }
  65. /**
  66. * 前进后退统一处理区
  67. *
  68. * @param {number} 前进后退处理参数
  69. ----------1 前进处理
  70. ----------0 后退处理
  71. */
  72. U.AFB.GQH = function (UTF) {
  73. var _UCB = this.OF[this.OL - UTF * 2]; //获取前进后退事件
  74. (_UCB) && (_UCB(), this.OL += ((-UTF * 2) + 1)); //前进后退执行
  75. }
  76. /**
  77. * 后退执行
  78. *
  79. * @param {string} 前进后退在指定的域
  80. */
  81. U.AFB.DrawBack = function (UTF) {
  82. U.AFB.GoList[UTF]["UT"].GQH(1);
  83. }
  84. /**
  85. * 前进执行
  86. *
  87. * @param {string} 前进后退在指定的域
  88. */
  89. U.AFB.GoForward = function (UTF) {
  90. U.AFB.GoList[UTF]["UT"].GQH(0);
  91. }
  92. //设置原型 运行实例化使用
  93. U.AFB.init.prototype = {
  94. AddEvent: U.AFB.AddEvent,
  95. AddDrawBack: U.AFB.AddDrawBack,
  96. GQH: U.AFB.GQH,
  97. DrawBack: U.AFB.DrawBack,
  98. GoForward: U.AFB.GoForward
  99. }
  100. //#endregion
  101. //#region 网页路由使用
  102. /**
  103. * 添加路由监视
  104. *
  105. * @param {function} 监督url hash变化的处理
  106. */
  107. U.AFB.UrlRoute = function (UCB) {
  108. if (!U.AFB.UTH) { //监视使用的地址变化导航
  109. U.AFB.UTH = new U.AFB.Path(UCB).init();
  110. }
  111. return U.AFB.UTH; //返回路由
  112. }
  113. /**
  114. * 初始化url导航
  115. *
  116. * @param {function} 监督url hash变化的处理
  117. */
  118. U.AFB.Path = function (UCB) {
  119. this.UH = window.location.hash; //Hash值
  120. this.UDE = []; //前进后退记录
  121. this.UCB = UCB; //回调函数记录
  122. this.UIE = window.history.length; //当前浏览了多少页面
  123. this.UGT = this.UTF = true; //hash是否在变化
  124. this.IE = !("onhashchange" in window) || (document.documentMode < 8); //判断是否支持onhashchange
  125. }
  126. //路由统计区域
  127. U.AFB.TJ = function (UDE) {
  128. this.UE = UDE[0]; //记录的url处理
  129. this.UCB = UDE[1]; //回调函数
  130. }
  131. //添加独立路由设置
  132. U.AFB.Set = function (UDE) {
  133. var i, j, _UCE,
  134. _UTE = U.AFB.UrlRoute(),
  135. _UAE = _UTE.UDE;
  136. _UCE: for (i = 0; i < UDE.length; i++) {//生成添加
  137. for (j = 0; j < _UAE.length; j++) {
  138. //判断url所在的域下
  139. if (_UAE[j].UE.join("/") == UDE[i][0].join("/")) {
  140. continue _UCE;
  141. }
  142. }
  143. //
  144. _UAE.push(new this.TJ(UDE[i]));
  145. }
  146. }
  147. //添加设置Hash
  148. U.AFB.Add = function (UDE, UN) {
  149. if (UDE) {
  150. var i, _UST = UDE.join("/");
  151. _UST = _UST ? "#!/" + _UST : "";
  152. if (this.IE) {
  153. this.UGT = true;
  154. this.UTF = false; this.ICHT(this.UH, _UST);
  155. } //IE7要产生记录s
  156. this.setNC();
  157. $(document).addAttrArray({ "location": { "hash": _UST }, "title": "云端 - " + (UN ? UN : "1473.cn") }); return false; //生成Hash
  158. }
  159. }
  160. ////设置功能
  161. U.AFB.Path.prototype = {
  162. constructor: U.AFB.Path,
  163. UrlRoute: U.AFB.UrlRoute,
  164. TJ: U.AFB.TJ,
  165. Set: U.AFB.Set,
  166. Add: U.AFB.Add,
  167. init: function () {//初始化
  168. this.UH = window.location.hash; //生成
  169. if (this.UH) { this.Ch(); }
  170. if (this.IE) { document.documentElement.onpropertychange = window.onpropertychange = document.onpropertychange = U.M.apply(this, [[this.ICH]]); } //支持ie6 7处理
  171. window.onhashchange = U.M.apply(this, [[this.Ch]]);
  172. return this; //初始化的判断是否有值
  173. },
  174. Ch: function () { //地址变化使用
  175. if (this.UTF && !this.NC) {
  176. var i, _UTF, _USE, _UAE = this.UDE, _UDE = U.M.GetUF();
  177. if (_UDE[0]) { //路由事件使用
  178. for (i = 0; i < _UAE.length; i++) { //触发指定的回调
  179. if (_UAE[i].UE.join("/").indexOf(_UDE.join("/")) > -1) {
  180. (_UAE[i].UCB) && (_UAE[i].UCB()); return;
  181. }
  182. }
  183. //生成url的前进后退
  184. this.setNC();
  185. this.UCB(_UDE); //url回调
  186. // _USE = U.M.GetUF(); //获取hash值
  187. // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]);
  188. // this.Add(_UDE.slice(1));
  189. // _USE = U.M.GetUF();
  190. // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]);
  191. // this.GO(-1);
  192. // (_UTF) && ((U.M.GetUF().join("") == _UDE.join("")) && (this.GO(-1)));
  193. // this.Add(_UDE.slice(1));
  194. // this.UCB(_UDE); //设置url
  195. }
  196. }
  197. },
  198. setNC: function () { //处理onhashchange 重复
  199. if (!this.NC) {
  200. this.NC = true;
  201. setTimeout(U.M.apply(this, function () { this.NC = false; }), 0);
  202. } //设置当前使用
  203. },
  204. ICH: function () { //Hash值ie变化
  205. var _UE = window.event, _UHE = window.location.hash;
  206. if (_UE.propertyName == "onbeforeeditfocus" && this.UGT && _UHE != this.UH) {//判断是否需要加载hash
  207. if (this.UTF) { this.UGT = this.UTF = false; setTimeout(this.GO, 0); setTimeout(U.M.apply(this, [[this.AddHS, [_UHE]]]), 0); } //回车检测设置
  208. else { this.UH = _UHE; this.Ch(); } //统一设置
  209. }
  210. },
  211. AddHS: function (UH) { //IE6-7支持
  212. this.Add(UH.split("/").slice(1));
  213. this.UH = UH; this.UTF = true;
  214. },
  215. ICHT: function (UH, UNH) {//IE8一下的浏览器保存记录
  216. var _UDID = Guid.guidNoDash(),
  217. _UDOD = $$("iframe", { "UrlRoute": [UH, UNH, (this.UIE++)], "tabindex": "-1", "id": _UDID, "name": _UDID, "style": { "cssText": "width:0;height:0;display:none" }, "src": "about:blank" }, $("body")[0]); //创建记录的Iframe "javascript:void((function(){document.open();document.domain='" + document.domain + "';document.close()})())"
  218. U.M.AddEvent("load", _UDOD, U.M.apply(this, [[this.UQJH, [_UDOD]]])); //添加生成
  219. },
  220. UQJH: function (UDOD) {//产生一个接收前进后退的Iframe
  221. U.M.ReEvent("load", UDOD, arguments.callee.caller);
  222. var _UW = UDOD.contentWindow,
  223. _UD = _UW.document.open();
  224. _UD.close(); //生成记录
  225. U.M.AddEvent("load", UDOD, U.M.apply(this, [[this.AUQJH, [UDOD]]])); //前进后退变化
  226. },
  227. AUQJH: function (UDOD) {//前进后退回调
  228. var _UH = this.UH,
  229. _UNH = UDOD.UrlRoute,
  230. _UIE = this.UIE - _UNH[2];
  231. _UNH = _UNH[1 - _UIE]; //前进后退的判断
  232. this.UGT = true; this.UTF = false; this.UIE -= (_UIE * 2 - 1); if (_UH != _UNH) { document.location.hash = _UNH; } //重新设置hash值
  233. },
  234. GO: function (UTF) {
  235. window.history.go(UTF || -1);
  236. } //前进后退执行
  237. }
  238. ////设置功能
  239. //U.M.Setprototype(U.AFB.Path, {
  240. // constructor: U.AFB.Path,
  241. // UrlRoute: U.AFB.UrlRoute,
  242. // TJ: U.AFB.TJ,
  243. // Set: U.AFB.Set,
  244. // Add: U.AFB.Add,
  245. // init: function () {//初始化
  246. // this.UH = window.location.hash; //生成
  247. // if (this.UH) { this.Ch(); }
  248. // if (this.IE) { document.documentElement.onpropertychange = window.onpropertychange = document.onpropertychange = U.M.apply(this, [[this.ICH]]); } //支持ie6 7处理
  249. // window.onhashchange = U.M.apply(this, [[this.Ch]]);
  250. // return this; //初始化的判断是否有值
  251. // },
  252. // Ch: function () { //地址变化使用
  253. // if (this.UTF && !this.NC) {
  254. // var i, _UTF, _USE, _UAE = this.UDE, _UDE = U.M.GetUF();
  255. // if (_UDE[0]) { //路由事件使用
  256. // for (i = 0; i < _UAE.length; i++) { //触发指定的回调
  257. // if (_UAE[i].UE.join("/").indexOf(_UDE.join("/")) > -1) {
  258. // (_UAE[i].UCB) && (_UAE[i].UCB()); return;
  259. // }
  260. // }
  261. // //生成url的前进后退
  262. // this.setNC();
  263. // this.UCB(_UDE); //url回调
  264. // // _USE = U.M.GetUF(); //获取hash值
  265. // // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]);
  266. // // this.Add(_UDE.slice(1));
  267. // // _USE = U.M.GetUF();
  268. // // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]);
  269. // // this.GO(-1);
  270. // // (_UTF) && ((U.M.GetUF().join("") == _UDE.join("")) && (this.GO(-1)));
  271. // // this.Add(_UDE.slice(1));
  272. // // this.UCB(_UDE); //设置url
  273. // }
  274. // }
  275. // },
  276. // setNC: function () { //处理onhashchange 重复
  277. // if (!this.NC) {
  278. // this.NC = true;
  279. // setTimeout(U.M.apply(this, function () { this.NC = false; }), 0);
  280. // } //设置当前使用
  281. // },
  282. // ICH: function () { //Hash值ie变化
  283. // var _UE = window.event, _UHE = window.location.hash;
  284. // if (_UE.propertyName == "onbeforeeditfocus" && this.UGT && _UHE != this.UH) {//判断是否需要加载hash
  285. // if (this.UTF) { this.UGT = this.UTF = false; setTimeout(this.GO, 0); setTimeout(U.M.apply(this, [[this.AddHS, [_UHE]]]), 0); } //回车检测设置
  286. // else { this.UH = _UHE; this.Ch(); } //统一设置
  287. // }
  288. // },
  289. // AddHS: function (UH) { //IE6-7支持
  290. // this.Add(UH.split("/").slice(1));
  291. // this.UH = UH; this.UTF = true;
  292. // },
  293. // ICHT: function (UH, UNH) {//IE8一下的浏览器保存记录
  294. // var _UDID = Guid.guidNoDash(),
  295. // _UDOD = $$("iframe", { "UrlRoute": [UH, UNH, (this.UIE++)], "tabindex": "-1", "id": _UDID, "name": _UDID, "style": { "cssText": "width:0;height:0;display:none" }, "src": "about:blank" }, $("body")[0]); //创建记录的Iframe "javascript:void((function(){document.open();document.domain='" + document.domain + "';document.close()})())"
  296. // U.M.AddEvent("load", _UDOD, U.M.apply(this, [[this.UQJH, [_UDOD]]])); //添加生成
  297. // },
  298. // UQJH: function (UDOD) {//产生一个接收前进后退的Iframe
  299. // U.M.ReEvent("load", UDOD, arguments.callee.caller);
  300. // var _UW = UDOD.contentWindow,
  301. // _UD = _UW.document.open();
  302. // _UD.close(); //生成记录
  303. // U.M.AddEvent("load", UDOD, U.M.apply(this, [[this.AUQJH, [UDOD]]])); //前进后退变化
  304. // },
  305. // AUQJH: function (UDOD) {//前进后退回调
  306. // var _UH = this.UH,
  307. // _UNH = UDOD.UrlRoute,
  308. // _UIE = this.UIE - _UNH[2];
  309. // _UNH = _UNH[1 - _UIE]; //前进后退的判断
  310. // this.UGT = true; this.UTF = false; this.UIE -= (_UIE * 2 - 1); if (_UH != _UNH) { document.location.hash = _UNH; } //重新设置hash值
  311. // },
  312. // GO: function (UTF) {
  313. // window.history.go(UTF || -1);
  314. // } //前进后退执行
  315. //});
  316. //U.M.Setprototype(U.AFB.Path.prototype.init, U.AFB.Path.prototype);
  317. //#endregion