项目上要实现一个监控大屏全屏效果,h5提供的requestFullScreen出于安全策略,认为要实现全屏必须伴随用户的一个gesture,也就是js不能主动触发;首页点击一个按钮可以触发全屏,但是跳转大屏后会退出全屏效果,也就是页面之间的切换会退出全屏模式。之前搭框架的人是把login和home页面分开的,没有采用router去跳转,这就涉及到刚才提到的页面切换退出全屏。在此背景下,要实现全屏,就必须采用router形式进行页面跳转,记录下踩坑经历。
项目原有框架
- index.html 登陆页面
- home.html 首页(首页中局部区域页面切换采用的router)
- monitor.html 监控页面
流程如下:
1 2 3 4 5 6 7
| graph LR
A[登陆页] -->C{首页}
C -->|大屏| D[大屏页面]
C -->|局部切换| E{首页}
|
用户浏览器敲入地址后默认跳转登陆页,登陆后跳转(window.location.href形式)首页:
- 首页点击菜单局部切换页面(采用router形式);
- 首页如果点击大屏切换按钮则跳转大屏页面(因为之前的框架home页面并不是路由形式跳转,monitor页面也只能采用window的方式跳转)。
Router重新配置
重新整理后的流程如下:
1 2 3 4 5 6
| st=>start: 浏览器敲入地址 op=>operation: 登陆页面 cond=>condition: 首页
st->op->cond cond(yes)->op
|
index页面放ui-view标签,管理登陆页,首页和监控页面跳转,其中首页页面中加入子路由,控制首页菜单点击局部页面切换。系统默认进入首页中的欢迎页面,当然所有的页面进入会有监听$locationChangeStart,如果是进入登陆或者app部分页面不需要拦截,其他页面进入要判断是否有token或者token是否超时,如果没有或者超时直接弹出提示并跳转登陆页。
嵌套路由代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| $urlRouterProvider.when('', '/home/system-shouye'); $stateProvider .state('login', { url: '/login', templateUrl: '/dist/mab-view/login/login.html', controller: 'indexCtrl' }) .state('home', { url: '/home', templateUrl: '/dist/view/home.html', controller: 'homeCtrl' }) .state('home.welcome', { url: '/welcome', templateUrl: '/dist/view/shouye/system-shouye.html', controller: 'systemShouyeCtrl' }) .state('home.adminis-division', { url: '/adminis-division', templateUrl: '/dist/view/baseInfo/adminis-division.html', controller: 'adminisDivisionCtrl' }) .state('home.industry-type', { url: '/industry-type', templateUrl: '/dist/view/baseInfo/industry-type.html', controller: 'industryTypeCtrl' });
|
跳转拦截
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $rootScope.$on('$locationChangeStart',function (event, toState, toParams, fromState, fromParams) { var temp = toState.substring(toState.lastIndexOf('/') + 1); if ('login' === temp || toState.indexOf('app.html') > -1) { } else { var token = localFactory.get('access_token'); if (!token) { event.preventDefault(); $state.go('login'); } else if ((new Date()).getTime() > Number(sessionFactory.get('expired'))) { event.preventDefault(); $rootScope.alert.error('用户在线时长超过限制,请重新登陆', '页面跳转'); setTimeout(function () { $state.go('login'); }, 2000); } } });
|
页面跳转
1 2 3 4 5 6
| $state.go('login'); $state.go('home.welcome');
$location.url('/login'); $location.url('home/welcome');
|
路由修改后即可在首页点击大屏切换按钮后,使用路由方式跳转到monitor,同时调用全屏api进入全屏模式,bingo!