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 相关文章推荐
js获取当前时间显示在页面上并每秒刷新
Dec 24 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
May 13 Javascript
Jquery注册事件实现方法
May 18 Javascript
JS中frameset框架弹出层实例代码
Apr 01 Javascript
原生js仿jquery animate动画效果
Jul 13 Javascript
jquery点击展示与隐藏更多内容
Dec 03 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
小程序实现自定义导航栏适配完美版
Apr 02 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 Javascript
Vue中添加滚动事件设置的方法详解
Sep 14 Javascript
如何利用node转发请求详解
Sep 17 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
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
JS获取时间的方法
2015/01/21 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
vue中简单弹框dialog的实现方法
2018/02/26 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python 重命名轴索引的方法
2018/11/10 Python
python 格式化输出百分号的方法
2019/01/20 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
2019/02/01 Python
通过shell+python实现企业微信预警
2019/03/07 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python实现简单学生信息管理系统
2020/04/09 Python
python import 上级目录的导入
2020/11/03 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
国家助学金获奖感言
2014/01/31 职场文书
物流管理专业自荐信
2014/06/23 职场文书
国庆节活动总结
2014/08/26 职场文书
暑期培训班招生方案
2014/08/26 职场文书
对照四风自我剖析材料
2014/10/07 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
导游词之张家界
2019/10/31 职场文书
详解 TypeScript 枚举类型
2021/11/02 Javascript