详解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表单验证代码(包括例子)
Nov 11 Javascript
客户端js判断文件类型和文件大小即限制上传大小
Nov 20 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
Jul 17 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
Node.js编写组件的三种实现方式
Feb 25 Javascript
jQuery webuploader分片上传大文件
Nov 07 Javascript
简单实现node.js图片上传
Dec 18 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
Jan 25 Javascript
详解ECMAScript typeof用法
Jul 25 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
Apr 27 Javascript
vue 封装面包屑组件教程
Nov 16 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
2015/09/12 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
利用jqgrid实现上移下移单元格功能
2018/11/07 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
在Python下进行UDP网络编程的教程
2015/04/29 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python脚本处理空格的方法
2016/08/08 Python
深入理解Python3中的http.client模块
2017/03/29 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
Django ModelForm操作及验证方式
2020/03/30 Python
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
ORACLE第二个十问
2013/12/14 面试题
信息专业个人的自我评价
2013/12/27 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
中秋节祝酒词
2015/08/12 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python