您现在的位置是:首页 >技术交流 >js vue 监听 浏览器历史记录 控制手机实体返回键网站首页技术交流

js vue 监听 浏览器历史记录 控制手机实体返回键

星星~笑笑 2024-06-17 10:15:03
简介js vue 监听 浏览器历史记录 控制手机实体返回键

 简单示例:

先上代码,下面代码实现的是监听浏览器历史记录发生变化,替换当前界面的历史路由(站点记录)从而控制页面跳转

//页面生命周期:监听页面加载
onLoad(option) {
			if (window.history && window.history.pushState) {
				history.replaceState(null, null, this.$config.host_dev_b + '/h5/#/pages/customer/getUser') //替换当前界面历史站点记录
                //浏览器界面前进后退记录发生变化的监听事件
				window.addEventListener('popstate', this.goBack, false)
			}
},
//生命周期钩子:实例销毁后调用
destroyed() {
	 this.$router.replace({
		path: '/pages/main/mainForB'
	 })//替换当前浏览器就后,返回时跳转界面设置
     // 移除监听,否则其他界面会一直执行该监听事件,false阻止默认事件
	window.removeEventListener('popstate', this.goBack, false)
},
methods:{
    goBack() {
			uni.switchTab({
				url: '/pages/main/mainForB'
			})//替换当前浏览器就后,返回时跳转界面设置
             //移除监听,否则其他界面会一直执行该监听事件,false阻止默认事件
			window.removeEventListener('popstate', this.goBack, false)
	}
}

看不懂,别着急,慢慢往下看,耐住性子,你会得到你想要的,加油!

uniapp H5开发中会遇到很多关于前进后退的操作,像ios系统实体返回键(手机上的返回按钮)在返回上一层的时候就容易出错,比如我在某个界面定义了微信SDK配置等信息同时已进入界面就调用了地图(外链),然后选择位置带回界面,在重复执行就会造成数据丢失SDK配置错误,这时候在操作实体返回键的时候,将历史记录更改或替换,就不会出现该错误

window.history.back()window.history.forward()与浏览器的后退前进一样分别表示向后一页和向前一页。

window.history.go(num):

该方法采用一个整数作为参数,表示在历史堆栈中前进或后退多少步,

括号内直接填写数字num。正数:前进n个页面,负数:后退n个页面

// 向前移动一条记录,与 router.forward() 相同
router.go(1)
 
// 返回一条记录,与 router.back() 相同
router.go(-1)
 
// 前进 3 条记录
router.go(3)
 
// 如果没有那么多记录,静默失败
router.go(-100)
router.go(100)

window.location:

location.href或者this.$router.push()、history.pushState()方法跳转,则会向历史记录栈中添加一条数据

history.replaceState()与 history.pushState() 不同的是replaceState()  是修改了当前的历史记录项而不是新建一个,替换了当前的历史记录值

window.history.pushState():改动站点路径创建新的历史记录

/**
* 参数
* state: histroy.state 这个属性,如果你不做任何标识可以传null
* title: 浏览器标题(现在都不支持,所以都传空字符串'',你可以通过document.title = 'xxxx'去修改)
* url: 当前要修改的url,新的URL可以是任何和当前URL同源的URL     ps: '/xxxx'
* 该方法会让histroy.length 加一
*/
window.history.pushState(state, title, url)

window.history.replaceState()改动站点路径(更新当前的历史路径)不创建新的历史记录

/**
* 参数
*  state: histroy.state 这个属性,如果你不做任何标识可以传null
*  title: 浏览器标题(现在都不支持,所以都传空字符串'',你可以通过document.title = 'xxxx'去修改)
*  url: 当前要修改的url,新的URL可以是任何和当前URL同源的URL。 ps: '/xxxx'
* 该方法不会让histroy.length 加一,直接替换当前的历史栈      
*/
window.history.replaceState(state, title, url)

if (window.history && history.pushState){

  // 支持History API

} else {

  // 不支持

}

上面代码可以用来检查,当前浏览器是否支持History API。如果不支持的话,可以考虑使用Polyfill库History.js。可以参考文章开头的示例

this.$router.push()

跳转到指定URL,向history栈添加一个新的纪录,点击后退会返回至上一个页面

//编程写法:
//字符串
this.$router.push('/index') 
// 对象
this.$router.push({path:'/index'})
// 带查询参数,变成/backend/order?selected=2/,query传参
this.$router.push({path:'/index', query:{name: '123'} })
// 命名的路由 params传参
this.$router.push({name:'index', params:{name: '123'} })
//声明写法:
< router-link :to = “…” >

this.$router.replace()

方法跳转到指定URL,则不会向历史记录栈中添加数据,点击返回按钮不会回到这个页面

简单举例:A=> B=> C,在B=> C时用了replace,则B被C替换,历史记录的栈就成了这样:A=> C。此时,在C页面点击返回时会跳到A页面。

//编程写法
router.replace(...)
// push方法也可以传replace
this.$router.push({path: '/homo', replace: true})
//声明写法
<reouter-link :to="..." replace></router-link>

PS:this.$route.push({ path: '/home', replace: true })相当于this.$route.replace({ path: '/home' })

好了,以上完毕,实在理解不透彻,就每个都敲代码试下,加油!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。