H5实现阻止浏览器返回的效果(uniapp)

前言

最近在项目优化过程中遇到了一个问题,就是点击查看图片,图片在当前页面以遮罩层的形式展示在页面上,然后点击物理返回键,页面直接返回到了上一个页面,嗯?不对劲!确实是不合理的交互,图片还在展示的时候,点返回应该先把图片给收回来才对,于是拿着这个需求我就开启了思考...


一、需求分析

重新梳理下需要实现的效果:就是点击物理返回键或者浏览器返回的时候需要判断图片是否处于展示状态,如果不是,则正常返回;如果是,则需要先收起图片

二、具体实现

本人是用uni-app开发的,所以从代码以uni-app为例

1.APP端

uni-app其实是有一个相应的生命周期可以监听到页面返回

 这方法一开始都没搞懂是什么意思,后面遇到多了才理解。它能阻止页面的返回

onBackPress(e) {
	if (判断某些条件成立时阻止页面返回,做相应处理) {
		return true // 阻止返回,不阻止则不写
	}
}

根据这个方法就可以实现想要的效果,在页面即将关闭的时候,判断图片是否展示中,如果是,则阻止页面返回,收起图片。

onBackPress(e) {
	if (this.fullScreen) {
		this.fullScreen = false
		return true
	}
}

2.H5端

app端实现起来是十分方便,按道理H5端也可以用同样的方法去实现,but...在H5中,浏览器默认会监听返回按钮事件,而不会触发onBackPress函数。那么有没有可能去监听浏览器的返回呢?——答案当然是可以的

1. 首先在页面加载完后监听浏览器返回事件,并定义相应的方法

onLoad() {
	// #ifdef H5
	window.addEventListener('popstate', this.browserBack)
	// #endif
}

// 相当于
mounted() {
	// #ifdef H5
	window.addEventListener('popstate', this.browserBack)
	// #endif
}

// methods
browserBack() {
	if (this.fullScreen) {
		this.fullScreen = false
	}
}

2. 然后在点击查看图片的时候往浏览器push一条当前页面的记录(根据自己项目实际情况来决定push记录的时机)

openPic(url) {
	// #ifdef H5
    window.history.pushState(null, null, document.URL)
	// #endif
    this.fullScreenPic = url
    this.fullScreen = true
}

3. 需要注意的是,收起图片的时候需要同时返回页面栈,防止用户查看图片后正常收起图片,导致需要返回两次才能回到上一页的情况

closePic() {
	// #ifdef H5
    window.history.go(-1)
	// #endif
	this.fullScreen = false
}

4. 最后需要在页面注销的时候销毁监听事件,不然会影响其他页面

onUnload() {
	// #ifdef H5
	window.removeEventListener("popstate", this.browserBack);
	// #endif
}

// 相当于
destroyed() {
	// #ifdef H5
	window.removeEventListener("popstate", this.browserBack);
	// #endif
}

3.测试总结

微信浏览器、安卓自带浏览器(WebKit内核)、ios-safari浏览器,左滑返回和浏览器返回均无问题

三、思路拓展

监听浏览器返回可以实现的其他场景:表单无修改/无填写返回提示​​​​


总结

以上就是我的学习分享,如果你有什么不同的看法,欢迎在评论区交流~

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现在微信浏览器中进行H5分享,可以通过以下步骤实现: 1. 引入微信JS-SDK库:在H5页面的<head>标签中添加以下代码: ```html <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> ``` 这样就可以在页面中使用微信的JavaScript API了。 2. 配置微信分享参数:在页面正文中添加以下代码: ```html <script> // 通过ajax请求服务器端获取微信分享所需要的参数 $.ajax({ url: 'your_server_url', data: { // 在服务器端生成签名所需要的参数,如当前页面的URL等 }, success: function(response) { // 服务器返回的数据包括签名等信息 wx.config({ debug: false, // 开启调试模式,可在开发阶段进行调试 appId: response.appId, timestamp: response.timestamp, nonceStr: response.nonceStr, signature: response.signature, jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline'] // 需要使用的分享接口列表 }); // 配置成功后进行分享 wx.ready(function() { wx.onMenuShareAppMessage({ title: '分享标题', // 分享标题 desc: '分享描述', // 分享描述 link: '分享链接', // 分享链接 imgUrl: '分享图标', // 分享图标 success: function () { // 用户完成分享后的回调函数 }, cancel: function () { // 用户取消分享后的回调函数 } }); // 可以添加更多分享接口... }); }, error: function(xhr, status) { // 处理请求失败的情况 } }); </script> ``` 以上代码首先通过ajax请求服务器端获取微信分享所需要的参数,包括appId、timestamp、nonceStr、signature等。然后通过wx.config方法进行配置,指定需要使用的分享接口。wx.ready方法中可以添加多个分享接口的配置,如onMenuShareTimeline等。配置成功后,用户点击分享按钮即可进行分享操作。 以上就是在H5页面中实现微信浏览器分享的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值