详解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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
JavaScrip单线程引擎工作原理分析
Sep 04 Javascript
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
AngularJS基础知识
Dec 21 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
Mar 01 Javascript
基于jquery css3实现点击动画弹出表单源码特效
Aug 31 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
angular实现spa单页面应用实例
Jul 10 Javascript
微信小程序文章详情页跳转案例详解
Jul 09 Javascript
vue实现页面切换滑动效果
Jun 29 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
Jul 07 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 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缓存设计实现代码
2011/09/30 PHP
php的大小写敏感问题整理
2011/12/29 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Python中使用PDB库调试程序
2015/04/05 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
公务员培训自我鉴定
2013/09/19 职场文书
物流管理毕业生自荐信
2013/10/24 职场文书
《匆匆》教学反思
2014/02/22 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
MySQL开启事务的方式
2021/06/26 MySQL
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript