详解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实现self的resend
Jul 22 Javascript
jQuery图片轮播的具体实现
Sep 11 Javascript
调用HttpHanlder的几种返回方式小结
Dec 20 Javascript
学习JavaScript设计模式(接口)
Nov 26 Javascript
jquery实现网页定位导航
Aug 23 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
详解JavaScript的内置对象
Dec 07 Javascript
jquery uploadify隐藏上传进度的实现方法
Feb 06 Javascript
JS实现课堂随机点名和顺序点名
Mar 09 Javascript
Vue如何引入远程JS文件
Apr 20 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
Aug 30 Javascript
webpack4.0 入门实践教程
Oct 08 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
AM/FM收音机的安装与调试
2021/03/02 无线电
第六节 访问属性和方法 [6]
2006/10/09 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
python实现每次处理一个字符的三种方法
2014/10/09 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
canvas小画板之平滑曲线的实现
2020/08/12 HTML / CSS
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
Structs界面控制层技术
2013/10/11 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
有创意的广告词
2014/03/18 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书