前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Web 游戏监听浏览器返回点击事件 !

Web 游戏监听浏览器返回点击事件 !

作者头像
一枚小工
发布于 2020-07-22 08:42:11
发布于 2020-07-22 08:42:11
1.9K00
代码可运行
举报
文章被收录于专栏:Cocos Creator开发Cocos Creator开发
运行总次数:0
代码可运行

引用场景

做 web 游戏时,通常游戏是嵌入到 app 内部,通过 app 内部入口,跳转进入所开发的 web 游戏,app 内会预留返回功能,web 游戏可以使用 webview 自带的返回,实现游戏内不同场景的跳转。

比如游戏内有 a、b、c 三个场景,其中 a 场景是启动页面,a 场景进入 b 场景,b 场景进入 c 场景,从 c 场景中点返回,回到 b 场景,从 b 场景中点击返回,回到 a 场景, 从 a 场景中点击返回,调用 webview自身的返回事件。最后的效果如下图:

事件监听

当浏览器活动历时记录条目更改时,将触发 popstate 事件,如用户点击浏览器的回退按钮,或者在 javascript 代码中调用 history.back() 或者 history.forward() 方法,所以只需要在需要监听事件的场景

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.addEventListener('popstate', 
  e => {
      //添加点击返回处理逻辑
  },
  false
);

事件的消费和添加

仅仅监听事件,还是不够的,虽然写了监听逻辑,但是浏览器本身的返回事件还是触发的,这时候点击返回,还是会继续回到之前页面,所以需要添加一个新的状态,让浏览器不跳转到前一个页面,就需要用到 history.pushState() 方法。

history.pushState() 方法,是向当前浏览器会话的历史堆栈中添加一个状态 (state) ,添加以后,点击浏览器的返回,会消耗掉会话历史堆栈中栈顶的状态,也就是我们注册的最新的状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let state = { 
    title: "title", 
    url: null
}; 
window.history.pushState(state, "title", null);

其中 title 是标题,目前浏览器基本上是忽略这个参数,可以不管,url 是跳转地址,游戏内不需要跳转其他地址,直接传 null 即可。

事件的全局控制

使用 cocos creator 开发游戏,注册 popstate 监听事件后,在浏览器点击返回时,会在每个注册的位置触发,实际游戏场景中,只需要执行一次就够。

比如有 3 个游戏场景 a、b、c,从 a 中点击进入 b,从 b 中点击进入 c,b 和 c 内都注册了事件,这时候如果 b 和 c 分别直接注册,都会触发,导致界面显示出错。

像上述场景,就需要整体控制事件的添加和注册,每次添加事件和注册回调,放置到一个堆栈顶部,当事件触发时,从栈顶取出最新的一个,进行回调就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default class PopStateMgr{
    /**
     * @desc: 注册返回事件
     * @param {type} 
     * @return: 
     */
    static push(onBackClick:any){
        PopStateMgr._events.push(onBackClick);
        let state = { 
            title: "title", 
            url: null
        }; 
        window.history.pushState(state, "title", null);
        window.addEventListener('popstate', 
            e => {
                PopStateMgr._onBackClick();
            },
            false
        );
    }

    private static _onBackClick(){
        if(PopStateMgr._events.length <= 0){
            return;
        }

        let func = PopStateMgr._events.pop();
        if(func != null){
            func();
        }
    }

    private static _events:any[] = [];
}

类似上面这种,在需要监听返回事件的场景脚本组件内,调用 push 及触发的回调事件就行。如本实例中,就在 b 场景开始时,调用 push 注册事件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一枚小工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【干货】JS如何判断用户是否点击浏览器“退回”按钮返回上一个界面?
通过window的popstate事件可以监听history的变化,但是,popstate会在浏览器前进后退操作、history.go/back/forward调用、hashchange的时候被触发,它是一个复合事件,你根本判断不了到底是哪种情况引起的popstate。更难理解的是,我不知道为什么要把forward也设计为popstate,pop这个词的意思不就是从stack顶把最上面的一个从栈中移除么?forward明显是push的行为,怎么也放到popstate里面。这个事件有设计缺陷。回到题目,我们怎么去判断用户是点击了“退回”按钮?
否子戈
2022/04/28
6.8K0
【JavaScript 教程】浏览器—History 对象
window.history属性指向 History 对象,它表示当前窗口的浏览历史。
winty
2020/04/01
1.2K0
【JavaScript 教程】浏览器—History 对象
微前端07 : 对single-spa的路由管理及微应用状态管理的分析
从流程图中,关于路由管理的初始化,single-spa做了4件事情。我们同时看看代码:
杨艺韬
2022/09/27
1.5K0
微前端07 : 对single-spa的路由管理及微应用状态管理的分析
阿里P7:你了解路由吗?
年后被迫跳槽,其中种种一言难尽,于是投递简历,虽然有了年前尝试积累,但年前毕竟不是真正的跳槽。由于没有遵循大佬们的跳槽心得,面试时,先投小厂,再投大厂,导致,随机面试,上来就遇见了个阿里的P7,被问的哑口无言。时隔半月,复盘总结
用户7413032
2024/01/29
1370
阿里P7:你了解路由吗?
HTML 面试要点:History 和 Hash 路由方式
越来越多的应用使用 Ajax 请求数据,浏览器 URL 不会发生任何变化。同时,浏览的页面内容在用户下次使用 URL 访问时将无法重新呈现,使用路由可以很好地解决这个问题。
Cellinlab
2023/05/17
8500
ajax无刷新页面切换,历史记录后退前进解决方案
我们在工作中常常遇到需要用ajax来显示下一页和上一页,ajax可以不刷新页面进行操作!但是,假如你想通过浏览器的历史记录返回上一页和下一页。那么ajax默认是做不到的!一般需求要历史返回的时候,我们通常不使用ajax。但是呢,假如一个页面中,只有一个地方是需要动态的上一页下一页,其他地方都是固定的,那么这种情况除了使用模板之外,我们使用ajax来操作显得格外方便!那么如何解决ajax历史记录的返回和前进呢?今天我们就一起来学习一下!
用户7657330
2020/08/14
1.4K0
你好,谈谈你对前端路由的理解
作者:尼克陈 https://juejin.cn/post/6917523941435113486
用户4456933
2021/06/01
9960
你好,谈谈你对前端路由的理解
一文搞懂前端路由的原理(Vue、React、Angular)
前端三大框架 Angular、React、Vue ,它们的路由解决方案 angular/router、react-router、vue-router 都是基于前端路由原理进行封装实现的,因此将前端路由原理进行了解和掌握是很有必要的,因为我们再使用的过程中也难免会遇到一些坑,一旦我们掌握了它的实现原理,那么就能在开发中对路由的使用更加游刃有余。
前端老道
2022/03/29
1.3K0
一文搞懂前端路由的原理(Vue、React、Angular)
ReactRouter的实现
ReactRouter是React的核心组件,主要是作为React的路由管理器,保持UI与URL同步,其拥有简单的API与强大的功能例如代码缓冲加载、动态路由匹配、以及建立正确的位置过渡处理等。
WindRunnerMax
2021/01/29
1.4K0
hash和history的原理和区别
目前单页应用(SPA)越来越成为前端主流,单页应用一大特点就是使用前端路由,由前端来直接控制路由跳转逻辑,而不再由后端人员控制,这给了前端更多的自由。
前端小tips
2021/11/23
2K0
hash和history的原理和区别
前端路由三种模式原理
整个页面重新加载,浏览器历史可以显示每一个地址。考虑到安全性但是JS代码中是无法操作的。 2. Hash路由方式。
19组清风
2021/11/15
1.1K0
H5及微信小程序实测可用——监听手机返回键操作
微信小程序开发过程中我们经常遇到需要监听点击左上角返回、手机物理返回键或者左滑返回的需求 微信原生是没有API支持监听的 这时候我们可以借助以下两种方法实现该操作
我只会写Bug啊
2023/12/25
2.5K1
url的操作之pushState、replaceState和popstate
上一节我们说地址栏跳转的时候,谈到了浏览器会缓存用户访问url序列,我们可以通过浏览器的前进后退按钮或者通过js提供的方法,访问这个序列里的url,不过关于这一点上一节我们只说了window.history.go,这里补充两个方法。
十里青山
2022/08/22
2.9K0
js监听手机端点击物理返回键或js监听pc端点击浏览器返回键
之前在项目中遇到一个问题,就是在微信网页上面本来是有返回按钮的,但是大多数人都为了方便,会使用安卓手机自带的物理返回键,这个返回键按下后,就会按照你浏览器的栈存储的路径来一层一层返回,就不执行你页面上的那个返回按钮的操作了,但是这个物理返回键的监听好像没有直接的办法进行,所以有人就想到了曲线的办法
lin_zone
2018/08/15
9.4K0
History API与浏览器历史堆栈管理
移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构。传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持onhashchange属性的IE6-7需要设置定时器不断检查hash值改变,性能上并不是很友好。 而如今,在移动端开发中HTML5规范给我们提供了一个History接口,使用该接口可以自由操纵历史记录。本文并不详细介绍History接口,而是探究History接口如何影响浏览器历史堆栈,并且利用这个规律应用到具
欲休
2018/03/15
2.9K0
History API与浏览器历史堆栈管理
【面试题】hash 与 history 路由的实现原理
实现路由的方式:hash模式 和 history模式 两种方式,不论是 angular、vue 还是 React都是这样实现的。
用户9914333
2022/12/14
1.5K0
【面试题】hash 与 history 路由的实现原理
hash和history路由模式
前端路由是指在浏览器端控制页面内容切换显示的机制。在没有服务器端参与的情况下,前端路由可以根据URL的变化,对应展现不同的内容,实现页面的“伪”跳转。
y191024
2024/01/29
2340
hash和history路由模式
前端-如何精确统计页面停留时长
页面停留时间(Time on Page)简称 Tp,是网站分析中很常见的一个指标,用于反映用户在某些页面上停留时间的长短,传统的Tp统计方法会存在一定的统计盲区,比如无法监控单页应用,没有考虑用户切换Tab、最小化窗口等操作场景。 基于上述背景,重新调研和实现了精确统计页面停留时长的方案,需要 兼容单页应用和多页应用,并且不耦合或入侵业务代码。
grain先森
2019/03/29
9.9K0
前端-如何精确统计页面停留时长
深入揭秘前端路由本质,手写 mini-router
前端路由一直是一个很经典的话题,不管是日常的使用还是面试中都会经常遇到。本文通过实现一个简单版的 react-router 来一起揭开路由的神秘面纱。
胡哥有话说
2020/09/24
1.5K0
深入揭秘前端路由本质,手写 mini-router
pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新
再通过 onhashchange 事件监听hash锚点的变化,手动进行前进后退操作,浏览器支持度
书童小二
2018/09/03
2.4K0
pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新
推荐阅读
相关推荐
【干货】JS如何判断用户是否点击浏览器“退回”按钮返回上一个界面?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文