vue单页面在微信下只能分享落地页的解决方案


Posted in Javascript onApril 15, 2019

实际上关键词叫 微信pushState只能分享落地页 更贴切一点

应用场景:

  1. vue + vue-router
  2. vue-router使用hash模式(history模式没试过)
  3. 不使用微信的js-sdk(因为我这个项目是可配置域名的商城,比较特殊,不能使用微信sdk)

这个方案并不是最优秀的,会对性能造成一定的影响

HTML5 history.pushState

vue-router的内部是通过 history.pushState 和 history.replaceState 实现的。但是iOS设备的微信浏览器不会去检测它们的变化。但是我们可以通过更新 location.href 让微信浏览器识别到当前的url。

// vue-router/src/util/push-state.js

export function pushState (url?: string, replace?: boolean) {
 saveScrollPosition()
 // try...catch the pushState call to get around Safari
 // DOM Exception 18 where it limits to 100 pushState calls
 const history = window.history
 try {
  if (replace) {
   history.replaceState({ key: _key }, '', url)
  } else {
   _key = genKey()
   history.pushState({ key: _key }, '', url)
  }
 } catch (e) {
  window.location[replace ? 'replace' : 'assign'](url)
 }
}

export function replaceState (url?: string) {
 pushState(url, true)
}

解决方法

window.location.href = window.location.href ,这段代码可以让微信记录当前的url,且不会刷新页面。可以在app.vue中 watch $route 在每次页面更新的时候执行一次。

// app.vue

watch: {
 $route: {
  immediate: true,
  deep: true,
  handler(to) {
   // 微信浏览器判断
   const WECHAT_BROWSER = navigator.userAgent.toLowerCase().includes('micromessenger')

   // 解决iOS微信浏览器分享地址只能是落地页的问题,这个操作是不会刷新页面的,query参数改变也会执行
   if (WECHAT_BROWSER) {
    // eslint-disable-next-line
    window.location.href = window.location.href
   }
  }
},

使用了上述方法可以解决这个问题,但是这会引出一个很奇葩的问题,在真机上进入 http://192.168.1.5:8080 和 http://192.168.1.5:8080/#/ 这两个页面,其中有一个链接的bug依然存在。原因具体不清楚,经过测试可以在入口文件(main.js)中在页面还没有展示内容前刷新一次页面,即可解决这个问题。

// main.js

// 微信浏览器判断
const WECHAT_BROWSER = navigator.userAgent.toLowerCase().includes('micromessenger')

// 在url插入的search参数,可以随意,但是必须要
// 例:http://192.168.1.5:8080/?_wx_=1#/
const wxQuery = '_wx_=1'
const isRepeatQuery = location.search.includes(wxQuery)
if (WECHAT_BROWSER && !isRepeatQuery) {
 const unit = (location.search && location.search !== '?') ? '&' : '?'
 location.search += unit + wxQuery  // 添加_wx_参数,该操作会刷新页面
}

上面的代码之所以要在 hash 前面加一个 ?_wx_=1 参数,为了方便刷新页面给一个标志位判断是否已刷新。参数的 key-value 随意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery使用手册之三 CSS操作
Mar 24 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
js 代码优化点滴记录
Feb 19 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
jquery事件的ready()方法使用详解
Nov 11 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 jQuery
利用纯JS实现像素逐渐显示的方法示例
Aug 14 Javascript
简单的网页广告特效实例
Aug 19 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
Sep 24 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
JS实现斐波那契数列的五种方式(小结)
Sep 09 Javascript
vue--vuex详解
Apr 15 #Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 #Javascript
小程序数据通信方法大全(推荐)
Apr 15 #Javascript
前端面试知识点目录一览
Apr 15 #Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 #Javascript
vue-cli项目使用mock数据的方法(借助express)
Apr 15 #Javascript
说说Vuex的getters属性的具体用法
Apr 15 #Javascript
You might like
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
PHP 截取字符串专题集合
2010/08/19 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
尽可能写"友好"的"Javascript"代码
2007/01/09 Javascript
js树形控件脚本代码
2008/07/24 Javascript
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
[03:15]2014DOTA2国际邀请赛 专访国士无双信心满满
2014/07/12 DOTA
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python实现音乐下载的统计
2018/06/20 Python
Python读取表格类型文件代码实例
2020/02/17 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
总经理助理工作职责
2014/02/06 职场文书
年级组长自我鉴定
2014/02/22 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
龙门石窟导游词
2015/02/02 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书