详解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 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
Dec 06 Javascript
JS分割字符串并放入数组的函数
Jul 04 Javascript
JS 实现图片直接下载示例代码
Jul 22 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
老生常谈 js中this的指向
Jun 30 Javascript
jQuery EasyUI提交表单验证
Jul 19 Javascript
vue-cli的eslint相关用法
Sep 29 Javascript
koa上传excel文件并解析的实现方法
Aug 09 Javascript
Element Dialog对话框的使用示例
Jul 26 Javascript
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下通过file_get_contents的代理使用方法
2011/02/16 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
js prototype截取字符串函数
2010/04/01 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
jquery中radio checked问题
2015/03/16 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
详解javascript函数的参数
2015/11/10 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
HTML5 实现的一个俄罗斯方块实例代码
2016/09/19 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
vant实现购物车功能
2020/06/29 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
Python用threading实现多线程详解
2017/02/03 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
python中二分查找法的实现方法
2020/12/06 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
新店开张活动方案
2014/08/24 职场文书
甲午风云观后感
2015/06/02 职场文书
导游词之杭州西湖
2019/09/19 职场文书
SpringDataJPA在Entity中常用的注解介绍
2021/12/06 Java/Android
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL