详解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 相关文章推荐
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
移动端界面的适配
Jan 11 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
Jan 27 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
May 09 jQuery
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
layui使用label标签的方法
Sep 14 Javascript
vue路由缓存的几种实现方式小结
Feb 02 Javascript
js实现经典贪吃蛇小游戏
Mar 19 Javascript
vue-cli3自动消除console.log()的调试信息方式
Oct 21 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的垃圾回收机制详解
2013/10/28 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
javascript中对对层的控制
2006/12/29 Javascript
用javascript实现的激活输入框后隐藏初始内容
2007/06/29 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
浅析Python的Django框架中的Memcached
2015/07/23 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
基于python图像处理API的使用示例
2020/04/03 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
希特勒经典演讲稿
2014/05/19 职场文书
思想政治表现评语
2015/01/04 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫