一、路由介绍
https://www.baidu.com/,访问这个的地址,你会进入一个页面,
https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=ds,访问这个地址,你会进入另一个页面。
用现象来解释的话,这就是路由
二、cocoscreator发布 h5,路由现状
假设你的h5的项目发布到域名 https://xxxx.com,而且你未对路由进行过任何处理,你在域名后面面加后缀如https://xxxx.com/?scene=GameScene,永远只会跳转到第一个场景。
我们接下来根据百度的效果,来实现路由的功能
三、路由功能实现
1、根据所处场景不同,或者用户执行回退时,动态改变浏览器地址栏
假设百度是由cocoscreator实现的,有三个场景 guojiScene.fire(国际),guoneiScene.fire(国内),junshiScene.fire(军事)。
当前处于guojiScene,地址栏https://news.baidu.com/guoji,现在点击跳转到guoneiScene,地址栏更改为https://news.baidu.com/guonei
而此时如果点击浏览器回退,则又跳回到https://news.baidu.com/guoji
以上功能 由下面实现
// 监听场景加载完成
cc.director.on(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () {
// 获取当前场景名
let loadedScene = cc.director.getScene().name;
// 并且添加进历史,使得浏览器的回退功能生肖
history.pushState(
tLocation.state,
null,
// 将场景名写入到地址栏
"/?scene=" + loadedScene
);
}, this);
2、点击回退后,实现跳转
1的代码只能够保证执行回退按钮的时候,更改地址栏,但是要能够跳转到我们需要的页面,需要这么做。
if ("onpopstate" in window) {
// 操作回退后要执行跳转
window.addEventListener("popstate", function (e) {
// 获得当前地址栏的场景参数
var tRoute =queryToObj(window.location.href).scene;
cc.director.loadScene(tRoute);
}, false);
}
这样可以监控到回退后地址栏的变化,并且拉取scene参数执行跳转
3、根据输入scene参数,实现跳转对应场景
当然上述方式,是在跳转场景发生后,去改变地址栏。但是如果反过来呢,用户主动地址栏输入了scene,那么该如何跳转呢。
我们需要修改main.js
// data为域名后加入的参数,query函数需要自己实现
var data = query(window.location.href);
if (data.scene =="LoginScene"){
loadScene("LoginScene");
}else {
loadScene("HallScene");
}
也就是在第一次加载场景的时候,我们就要去读区地址栏了
四、引发思考
上面介绍的例子,只教大家如何获取scene参数实现跳转场景。如果你能比较快的举一反三的话,会发现路由能够实现的东西有很多。
路由本质上只是一个参数携带装置,至于这些参数定义成什么,能够带动那些逻辑功能,是由你决定的。
你可以通过参数实现跳转场景,也可以通过参数实现控制 测试/正式 环境切换,或者实现测试帐号登录 等等...