详解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 相关文章推荐
网上抓的一个特效
May 11 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
分享五个有用的jquery小技巧
Oct 08 Javascript
Bootstrap框架下下拉框select搜索功能
Mar 26 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
JavaScript中利用for循环遍历数组
Jan 15 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
Mar 03 Javascript
JS实现的Unicode编码转换操作示例
Apr 28 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 Javascript
JS如何把字符串转换成json
Feb 21 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
jQuery 连续列表实现代码
2009/12/21 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
python实现simhash算法实例
2014/04/25 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
python变量不能以数字打头详解
2016/07/06 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python3+PyQt5实现柱状图
2018/04/24 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
大学生农村教师实习自我鉴定
2013/09/21 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
离婚财产分割协议书
2015/08/11 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python