最近项目中遇到了一个返回首页的问题,就是业务流程的最后一步完成后要返回到首页。在这期间跳转了很多页面,用mui.back()只能返回到上一级页面,多次调用也没用。
原创文章,欢迎转载.转载请注明出处: https://www.jianshu.com/p/b66f246bdbbc
解决方案
5+给页面对象提供两个方法可以完美的解决这个问题,这两个方法分别是:
- opener方法,获取上一级页面:
page.opener();
- close方法,关闭页面:
page.close();
假如从首页跳转到A页面,从A页面跳转到B页面,从B页面跳转到C页面,C页面里有个完成按钮,点击返回到首页。实现完成按钮返回首页的功能只需要三步:
- 第一步,获取当前页面(C页面);
- 第二步,获取当前页面的上一级页面(B页面)和上一级页面的上一级页面(A页面);
- 第三步,关闭当前页面(C页面)、B页面和A页面,完成。
通过上面三步就可以实现,视觉上的效果和返回到上级页面的效果一样(不用担心会出现多次返回动画。亲测,不管有多少层级,只有一次返回动画就返回到了首页),对应的代码如下:
//获取当前页面
var cPage = plus.webview.currentWebview();
//获取上一级页面(B页面)
var bPage = cPage.opener();
//获取上一级页面的上一级页面(A页面)
var aPage = bPage.opener();
//关闭当前页面(C页面)、B页面和A页面
cPage.close();
bPage.close();
aPage.close();
封装-返回到任意的父级页面
我们在用 mui.openWindow() 跳转页面的时候一般都会指定一个页面id,只要我们知道这个id就可以获取到这个页面(关于应用的入口页面id,请参考文章末尾的注意)。再利用上面5+给页面对象提供的两个方法就可以返回到任意的父级页面。
实现思路:
- 第一步,判断目标页面id是否存在(即是否能找到这个id的页面),存在则执行第二步,否则退出。
- 第二步,判断目标页面是否是当前页面,不是则执行第三步,否则退出。
- 第三步,利用opener()方法循环遍历父级页面,并将要关闭的页面保存到pages数组中,直到找到目标页面为止。如果找到了目标页面则关闭pages数组中保存的所有页面之后退出,否则不关闭任何页面直接结束。
具体代码如下:
/**
* 从当前页面pop到目标页面
* @param {String} targetId 目标页面ID
*/
function popToTarget(targetId){
//获取目标页面
var target = plus.webview.getWebviewById(targetId);
if (!target) {
console.log("目标页面不存在!");
return;
}
//获取当前页面
var current = plus.webview.currentWebview();
if (current === target) {
console.log("目标页面是当前页面!");
return;
}
//将要关闭的页面
var pages = new Array(current);
//父级页面
var opener = current.opener();
while (opener){
if (opener === target) {//找到了目标页面
//关闭目标页面的所有子级页面pages
pages.map(function(page){
page.close();
});
return;
}
pages.push(opener);
opener = opener.opener();
}
//没有找到目标页面
console.log("目标页面不是当前页面的祖先页面!");
}
注意:
有一个页面,我们可能不知道它的id是多少,这个页面就是应用的入口页面(是在manifest中配置的),其实它的id就是appid。但是我们通过基座调试时IDE安装了一个叫"HBuilder"的应用,这个应用的appid是"HBuilder"并不是我们配置的appid(只有打包后才是我们自己配置的appid)。如果我们想要返回到应用的入口页面,直接传我们配置的appid,打包后是没有问题的。但是通过基座调试时就不能正常返回。所以建议直接通过getLaunchWebview()方法拿到应用的入口页面,然后获取它的id属性,这样不管是基座调试还是打包后都可以正常返回。具体实现只需要如下一句代码:
popToTarget(plus.webview.getLaunchWebview().id);
上面这些只是单纯的返回到目标页面,如果返回到目标页面后想对其刷新或做一些其他操作,可以参考下一篇文章:MUI-返回到首页(任意的父级页面)并刷新(或做其他操作)