/* 前进后退处理区域 用于场景 1、导航前进后退处理 2、记录用户步骤处理 3、url前进后退处理 */ Namespace.register("U.UF.N"); //#region 前进后退使用处理区域 U.UF.N.goList = {}; //前进后退处理 U.UF.N.route = null //url处理 /** * 前进后退公开调用区域 * * @param {string} 前进后退在指定的域 * @param {boolean} 是否重新加载 */ U.UF.N.createNav = function (str, bool) { var _obj = U.UF.N.goList; //根据类类型 获取前进后退类 if (_obj[str] && bool !== true) { //已经存在域的前进后退 return _obj[str].context; } else { //创建一个新的前进后退处理 return new U.UF.N.initNav(str); } } /** * 注册前进后退 * * @param {string} 前进后退在指定的域 如 disk 那就在disk导航 */ U.UF.N.initNav = function (str) { /* 描述 -----OF: 当前前进后退集合 -----OL: 前进后退所在的位置 -----UT: 当前的域 */ this.cb = []; this.length = 0; this.context = this; U.UF.N.goList[str] = this; //添加到集合里面 } /** * 添加前进后退 * * @param {function} 前进后退函数添加 * @param {string} 前进后退在指定的域 */ U.UF.N.addEvent = function (callback, str) { var _goList = U.UF.N.createNav(str); // 获取前进后退类 _goList.addHandleEvent(callback); // 注册前进后退事件 callback(); //添加执行前进后退 } /** * 添加前进后退事件 * * @param {function} 前进后退函数添加 */ U.UF.N.addHandleEvent = function (callback) { this.cb.splice(this.length, this.cb.length - this.length, callback); //添加一个回调函数 // this.cb.length - this.length 始终为0 this.length++; //位置加一 } /** * 前进后退统一处理区 * 该函数必须得先后退才能前进 * * @param {number} 前进后退处理参数 ----------1 后退处理 ----------0 前进处理 */ U.UF.N.handle = function (num) { var _callback = this.cb[this.length - num * 2]; //获取前进后退事件 // 若 num 为1 则 this.cb[this.length - num * 2] 为 this.cb[this.length - 1] // 若 num 为0 则 this.cb[this.length - num * 2] 为 this.cb[this.length] if (_callback) { _callback(); this.length += ((-num * 2) + 1); //前进后退执行 // 若 num 为1 则 将 this.length - 1 // 若 num 为0 则 将 this.length + 1 } } /** * 后退执行 * * @param {string} 前进后退在指定的域 */ U.UF.N.backOff = function (str) { U.UF.N.goList[str]["context"].handle(1); } /** * * 前进执行 * * @param {string} 前进后退在指定的域 */ U.UF.N.goAhead = function (str) { U.UF.N.goList[str]["context"].handle(0); } /** * * 获取当前位置 * * @param {string} 前进后退在指定的域 * @return {object} 返回位置信息 * 数据结构如下: { * count: 总计层级, * now: 当前层级(1为根级导航 当当前层级等于总计层级时为最后一级导航) * } */ U.UF.N.getLocation = function (str) { return { count: U.UF.N.goList[str].cb.length, now: U.UF.N.goList[str].length } } //设置原型 运行实例化使用 U.UF.N.initNav.prototype = { addEvent: U.UF.N.addEvent, addHandleEvent: U.UF.N.addHandleEvent, handle: U.UF.N.handle, backOff: U.UF.N.backOff, goAhead: U.UF.N.goAhead } //#endregion //#region 网页路由使用 // U.UF.N.isActive = false; /* * 作用:初始化函数,每次修改hash值的时候都会触发这个函数,调用onhashchange事件 * @param {callback} fun 回调函数,进行数据的操作 */ U.UF.N.route = function (fun) { //当浏览器前进后退修改hash值时,触发onhashchange事件 if (document.all && !document.documentMode) { //辨别IE,IE8才有documentMode /* 低于IE8的IE系列采用定时器监听 */ setInterval(function () { U.UF.N.changeHashCallBack(fun) }, 100); //每隔0.1秒监听一次hash值,发生变化时,触发U.UF.N.changeHashCallBack()这个函数 } else { window.onhashchange = function () { U.UF.N.changeHashCallBack(fun) }; //当hash值改变时,触发函数U.UF.N.changeHashCallBack() } } /* * 作用:给需要添加hash的元素添加hash值 * @param {string} hashname 添加hash的name */ U.UF.N.addHash = function (hashname) { U.UF.N.setHash(hashname); //给需要添加hash值的元素设置hash值,参数为添加hash的name } /* * 作用:给需要添加hash值的元素设置hash值 * @param {element} id 添加hash的值 */ U.UF.N.setHash = function (id) { U.UF.N.isActive = true; //设置成程序主动模式 location.hash = id; //给当前的hash值设值为用户自定义的hash的name //计时器处理 setTimeout(function () { //计时器处理,等浏览器响应hash后设置为非主动模式 U.UF.N.isActive = false; }, 10) } /* * 作用:获取当前的hash值 */ U.UF.N.getHash = function () { var _nowhash = location.hash; //获取当前的hash值 if (!_nowhash) {//判断是否有这个hash值 return ''; //如果没有返回空 } else {//如果有 return location.hash; //返回当前的hash值 } } /* * 作用:当hash改变之后,会触发这个函数 */ U.UF.N.changeHashCallBack = function (fun) { //如果不是通过程序添加的处理,而是用户自己输入到地址栏的处理 if (!U.UF.N.isActive) { var _newhash = U.UF.N.getHash(); //获取当前的hash值 var _hash = _newhash.substr('1'); //获取hash值的#符号后面的内容 if (_hash != "") { //判断U.UF.N.Data的json数据中是否存在这个hash值 fun(_hash); } else if (_hash == "") { window.history.forward(1); //如果是,禁止后退 } } } //#endregion