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 $.each()使用探讨
Sep 23 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
JavaScript对象的property属性详解
Apr 01 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
JavaScript 中调用 Kotlin 方法实例详解
Jun 09 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
Jul 22 jQuery
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
PHP类的特性实例分析
2016/09/28 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
javascript兼容性(实例讲解)
2017/08/15 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python AES加密实例解析
2018/01/18 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
Python正则表达式学习小例子
2020/03/03 Python
python爬虫---requests库的用法详解
2020/09/28 Python
大学生专科学习生活的自我评价
2013/12/07 职场文书
高中历史教学反思
2014/02/08 职场文书
年终晚会主持词
2014/03/25 职场文书
考核工作实施方案
2014/03/30 职场文书
保险内勤岗位职责
2015/04/13 职场文书
安全教育培训心得体会
2016/01/15 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
2021年pycharm的最新安装教程及基本使用图文详解
2021/04/03 Python
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Python基于百度API识别并提取图片中文字
2021/06/27 Python