详解vue填坑之解决部分浏览器不支持pushState方法


Posted in Javascript onJuly 12, 2018

前端使用vue-router做单页面路由并开启history模式时,会碰到一个问题:部分低版本的手机浏览器、部分app以及IE9浏览器由于不支持pushState方法,会导致页面加载不出来。 解决这个问题的思路是:

  • 当浏览器支持pushState方法时,开启history模式,不支持则开启hash模式
  • 对链接做判断,当跳转的链接与路由模式不匹配时,则跳转至正确的链接
  • nginx对域名下的路径访问均重写向至index.html

以下为具体实现方法:

判断使用何种路由模式

let isHans = typeof (history.pushState) === 'function';
let mode = isHans?'history':'hash';

判断请求链接

每次进入路由时,判断请求链接跳转的链接与路由模式不匹配时,则跳转至正确的链接

router.beforeEach(async (to, from, next) => {
  let toPath = to.fullPath,host = 'http://abc.cn';
  let url = host + toPath;
  let reUrl = url;
  if(isHans && url.indexOf(`${host}/#/`) >-1){
    reUrl = url.replace(`${host}/#/`,`${host}/car-insurance/`);
  }
  if(!isHans && url.indexOf(`${host}/#/`) === -1){
    reUrl = url.replace(`${host}/car-insurance/`,`${host}/#/`);
    reUrl = reUrl.replace(`${host}/`,`${host}/#/`);
  }
  if(reUrl !== url){
    window.location.replace(reUrl);
    return
  }

配置nginx

server {
  listen 80;
  listen 443;
  server_name abc.cn;
  root /data/html;
  index index.html index.htm index.json;

  access_log off ;
  set $isIndex 1;
  ##判断IE6-8
  if ($http_user_agent ~* "MSIE [6-8].[0-9]") {
    rewrite .* /static/ie8.html break;
  }

  if ( $request_uri ~* "/(favicon.ico|index.js|root.txt|jd_root.txt)$" ) {
   #不跳转到index.html
    set $isIndex 0;
  }
  if ( $request_uri ~* "/static/" ) {
   #不跳转到index.html
    set $isIndex 0;
  }

  if ($isIndex = 1 ){
      set $inIndexJS 0;
      rewrite .* /index.html;
      break;
   }
}a

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
[原创]保存的js无法执行的解决办法
Feb 25 Javascript
JavaScipt基本教程之JavaScript语言的基础
Jan 16 Javascript
Dom操作之兼容技巧分享
Sep 20 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
原生js实现图片轮播特效
Dec 18 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
angular.js指令中transclude选项及ng-transclude指令详解
May 24 Javascript
JavaScript 用fetch 实现异步下载文件功能
Jul 21 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
Apr 17 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
Nov 14 Javascript
解决vue中provide inject的响应式监听
Apr 19 Vue.js
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
Jul 12 #Javascript
vue中如何实现pdf文件预览的方法
Jul 12 #Javascript
js+css实现红包雨效果
Jul 12 #Javascript
基于vue cli 通过命令行传参实现多环境配置
Jul 12 #Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 #Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 #Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 #Javascript
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
24条货真价实的PHP代码优化技巧
2016/07/28 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
Python基于动态规划算法计算单词距离
2015/07/25 Python
Python解析最简单的验证码
2016/01/07 Python
Python中is与==判断的区别
2017/03/28 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
敬老院活动总结
2014/04/28 职场文书
土建工程师岗位职责
2014/06/10 职场文书
文明礼仪标语
2014/06/13 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
匿名检举信范文
2015/03/02 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers