/* 前进后退处理区域 用于场景 1、导航前进后退处理 2、记录用户步骤处理 3、url前进后退处理 */ Namespace.register("U.AFB"); //#region 前进后退使用处理区域 U.AFB.GoList = {}; //前进后退处理 U.AFB.UTH = null //url处理 //#endregion //#region 前进后退处理 /** * 前进后退公开调用区域 * * @param {string} 前进后退在指定的域 * @param {boolean} 是否重新加载 */ U.AFB.RGoL = function (UTF, UFT) { var _UDE = U.AFB.GoList; //根据类类型 获取前进后退类 if (_UDE[UTF] && UFT !== true) { //已经存在域的前进后退 return _UDE[UTF].UT; } else { //创建一个新的前进后退处理 return new U.AFB.init(UTF); } } /** * 注册前进后退 * * @param {string} 前进后退在指定的域 如 disk 那就在disk导航 */ U.AFB.init = function (UTF) { /* 描述 -----OF: 当前前进后退集合 -----OL: 前进后退所在的位置 -----UT: 当前的域 */ U.Ut.AddObj(this, { OF: [], OL: 0, UT: this }); U.AFB.GoList[UTF] = this; //添加到集合里面 } /** * 添加前进后退 * * @param {function} 前进后退函数添加 * @param {string} 前进后退在指定的域 */ U.AFB.AddEvent = function (UCB, UTF) { var _UTE = U.AFB.RGoL(UTF); UCB = U.M.apply(_UTE, UCB); _UTE.AddDrawBack(UCB); UCB(); //添加执行前进后退 } /** * 添加前进后退事件 * * @param {function} 前进后退函数添加 */ U.AFB.AddDrawBack = function (UCB) { this.OF.splice(this.OL, this.OF.length - this.OL, UCB); //添加一个前进后退时间 this.OL++; //位置加一 } /** * 前进后退统一处理区 * * @param {number} 前进后退处理参数 ----------1 前进处理 ----------0 后退处理 */ U.AFB.GQH = function (UTF) { var _UCB = this.OF[this.OL - UTF * 2]; //获取前进后退事件 (_UCB) && (_UCB(), this.OL += ((-UTF * 2) + 1)); //前进后退执行 } /** * 后退执行 * * @param {string} 前进后退在指定的域 */ U.AFB.DrawBack = function (UTF) { U.AFB.GoList[UTF]["UT"].GQH(1); } /** * 前进执行 * * @param {string} 前进后退在指定的域 */ U.AFB.GoForward = function (UTF) { U.AFB.GoList[UTF]["UT"].GQH(0); } //设置原型 运行实例化使用 U.AFB.init.prototype = { AddEvent: U.AFB.AddEvent, AddDrawBack: U.AFB.AddDrawBack, GQH: U.AFB.GQH, DrawBack: U.AFB.DrawBack, GoForward: U.AFB.GoForward } //#endregion //#region 网页路由使用 /** * 添加路由监视 * * @param {function} 监督url hash变化的处理 */ U.AFB.UrlRoute = function (UCB) { if (!U.AFB.UTH) { //监视使用的地址变化导航 U.AFB.UTH = new U.AFB.Path(UCB).init(); } return U.AFB.UTH; //返回路由 } /** * 初始化url导航 * * @param {function} 监督url hash变化的处理 */ U.AFB.Path = function (UCB) { this.UH = window.location.hash; //Hash值 this.UDE = []; //前进后退记录 this.UCB = UCB; //回调函数记录 this.UIE = window.history.length; //当前浏览了多少页面 this.UGT = this.UTF = true; //hash是否在变化 this.IE = !("onhashchange" in window) || (document.documentMode < 8); //判断是否支持onhashchange } //路由统计区域 U.AFB.TJ = function (UDE) { this.UE = UDE[0]; //记录的url处理 this.UCB = UDE[1]; //回调函数 } //添加独立路由设置 U.AFB.Set = function (UDE) { var i, j, _UCE, _UTE = U.AFB.UrlRoute(), _UAE = _UTE.UDE; _UCE: for (i = 0; i < UDE.length; i++) {//生成添加 for (j = 0; j < _UAE.length; j++) { //判断url所在的域下 if (_UAE[j].UE.join("/") == UDE[i][0].join("/")) { continue _UCE; } } // _UAE.push(new this.TJ(UDE[i])); } } //添加设置Hash U.AFB.Add = function (UDE, UN) { if (UDE) { var i, _UST = UDE.join("/"); _UST = _UST ? "#!/" + _UST : ""; if (this.IE) { this.UGT = true; this.UTF = false; this.ICHT(this.UH, _UST); } //IE7要产生记录s this.setNC(); $(document).addAttrArray({ "location": { "hash": _UST }, "title": "云端 - " + (UN ? UN : "1473.cn") }); return false; //生成Hash } } ////设置功能 U.AFB.Path.prototype = { constructor: U.AFB.Path, UrlRoute: U.AFB.UrlRoute, TJ: U.AFB.TJ, Set: U.AFB.Set, Add: U.AFB.Add, init: function () {//初始化 this.UH = window.location.hash; //生成 if (this.UH) { this.Ch(); } if (this.IE) { document.documentElement.onpropertychange = window.onpropertychange = document.onpropertychange = U.M.apply(this, [[this.ICH]]); } //支持ie6 7处理 window.onhashchange = U.M.apply(this, [[this.Ch]]); return this; //初始化的判断是否有值 }, Ch: function () { //地址变化使用 if (this.UTF && !this.NC) { var i, _UTF, _USE, _UAE = this.UDE, _UDE = U.M.GetUF(); if (_UDE[0]) { //路由事件使用 for (i = 0; i < _UAE.length; i++) { //触发指定的回调 if (_UAE[i].UE.join("/").indexOf(_UDE.join("/")) > -1) { (_UAE[i].UCB) && (_UAE[i].UCB()); return; } } //生成url的前进后退 this.setNC(); this.UCB(_UDE); //url回调 // _USE = U.M.GetUF(); //获取hash值 // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]); // this.Add(_UDE.slice(1)); // _USE = U.M.GetUF(); // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]); // this.GO(-1); // (_UTF) && ((U.M.GetUF().join("") == _UDE.join("")) && (this.GO(-1))); // this.Add(_UDE.slice(1)); // this.UCB(_UDE); //设置url } } }, setNC: function () { //处理onhashchange 重复 if (!this.NC) { this.NC = true; setTimeout(U.M.apply(this, function () { this.NC = false; }), 0); } //设置当前使用 }, ICH: function () { //Hash值ie变化 var _UE = window.event, _UHE = window.location.hash; if (_UE.propertyName == "onbeforeeditfocus" && this.UGT && _UHE != this.UH) {//判断是否需要加载hash if (this.UTF) { this.UGT = this.UTF = false; setTimeout(this.GO, 0); setTimeout(U.M.apply(this, [[this.AddHS, [_UHE]]]), 0); } //回车检测设置 else { this.UH = _UHE; this.Ch(); } //统一设置 } }, AddHS: function (UH) { //IE6-7支持 this.Add(UH.split("/").slice(1)); this.UH = UH; this.UTF = true; }, ICHT: function (UH, UNH) {//IE8一下的浏览器保存记录 var _UDID = Guid.guidNoDash(), _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()})())" U.M.AddEvent("load", _UDOD, U.M.apply(this, [[this.UQJH, [_UDOD]]])); //添加生成 }, UQJH: function (UDOD) {//产生一个接收前进后退的Iframe U.M.ReEvent("load", UDOD, arguments.callee.caller); var _UW = UDOD.contentWindow, _UD = _UW.document.open(); _UD.close(); //生成记录 U.M.AddEvent("load", UDOD, U.M.apply(this, [[this.AUQJH, [UDOD]]])); //前进后退变化 }, AUQJH: function (UDOD) {//前进后退回调 var _UH = this.UH, _UNH = UDOD.UrlRoute, _UIE = this.UIE - _UNH[2]; _UNH = _UNH[1 - _UIE]; //前进后退的判断 this.UGT = true; this.UTF = false; this.UIE -= (_UIE * 2 - 1); if (_UH != _UNH) { document.location.hash = _UNH; } //重新设置hash值 }, GO: function (UTF) { window.history.go(UTF || -1); } //前进后退执行 } ////设置功能 //U.M.Setprototype(U.AFB.Path, { // constructor: U.AFB.Path, // UrlRoute: U.AFB.UrlRoute, // TJ: U.AFB.TJ, // Set: U.AFB.Set, // Add: U.AFB.Add, // init: function () {//初始化 // this.UH = window.location.hash; //生成 // if (this.UH) { this.Ch(); } // if (this.IE) { document.documentElement.onpropertychange = window.onpropertychange = document.onpropertychange = U.M.apply(this, [[this.ICH]]); } //支持ie6 7处理 // window.onhashchange = U.M.apply(this, [[this.Ch]]); // return this; //初始化的判断是否有值 // }, // Ch: function () { //地址变化使用 // if (this.UTF && !this.NC) { // var i, _UTF, _USE, _UAE = this.UDE, _UDE = U.M.GetUF(); // if (_UDE[0]) { //路由事件使用 // for (i = 0; i < _UAE.length; i++) { //触发指定的回调 // if (_UAE[i].UE.join("/").indexOf(_UDE.join("/")) > -1) { // (_UAE[i].UCB) && (_UAE[i].UCB()); return; // } // } // //生成url的前进后退 // this.setNC(); // this.UCB(_UDE); //url回调 // // _USE = U.M.GetUF(); //获取hash值 // // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]); // // this.Add(_UDE.slice(1)); // // _USE = U.M.GetUF(); // // ((_UTF = _UDE.join("") == _USE.join(""))) && (this.Add[]); // // this.GO(-1); // // (_UTF) && ((U.M.GetUF().join("") == _UDE.join("")) && (this.GO(-1))); // // this.Add(_UDE.slice(1)); // // this.UCB(_UDE); //设置url // } // } // }, // setNC: function () { //处理onhashchange 重复 // if (!this.NC) { // this.NC = true; // setTimeout(U.M.apply(this, function () { this.NC = false; }), 0); // } //设置当前使用 // }, // ICH: function () { //Hash值ie变化 // var _UE = window.event, _UHE = window.location.hash; // if (_UE.propertyName == "onbeforeeditfocus" && this.UGT && _UHE != this.UH) {//判断是否需要加载hash // if (this.UTF) { this.UGT = this.UTF = false; setTimeout(this.GO, 0); setTimeout(U.M.apply(this, [[this.AddHS, [_UHE]]]), 0); } //回车检测设置 // else { this.UH = _UHE; this.Ch(); } //统一设置 // } // }, // AddHS: function (UH) { //IE6-7支持 // this.Add(UH.split("/").slice(1)); // this.UH = UH; this.UTF = true; // }, // ICHT: function (UH, UNH) {//IE8一下的浏览器保存记录 // var _UDID = Guid.guidNoDash(), // _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()})())" // U.M.AddEvent("load", _UDOD, U.M.apply(this, [[this.UQJH, [_UDOD]]])); //添加生成 // }, // UQJH: function (UDOD) {//产生一个接收前进后退的Iframe // U.M.ReEvent("load", UDOD, arguments.callee.caller); // var _UW = UDOD.contentWindow, // _UD = _UW.document.open(); // _UD.close(); //生成记录 // U.M.AddEvent("load", UDOD, U.M.apply(this, [[this.AUQJH, [UDOD]]])); //前进后退变化 // }, // AUQJH: function (UDOD) {//前进后退回调 // var _UH = this.UH, // _UNH = UDOD.UrlRoute, // _UIE = this.UIE - _UNH[2]; // _UNH = _UNH[1 - _UIE]; //前进后退的判断 // this.UGT = true; this.UTF = false; this.UIE -= (_UIE * 2 - 1); if (_UH != _UNH) { document.location.hash = _UNH; } //重新设置hash值 // }, // GO: function (UTF) { // window.history.go(UTF || -1); // } //前进后退执行 //}); //U.M.Setprototype(U.AFB.Path.prototype.init, U.AFB.Path.prototype); //#endregion