| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 | 
							- /*
 
- 前进后退处理区域
 
- 用于场景
 
- 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
 
 
  |