啥也不说直上代码,可能有逻辑不严谨的地方,如果有懂的朋友希望给指出。
$('#goOut')[0].addEventListener('tap', function(e) {
//清除用户数据
localStorage.setItem('$user', '{}');
//清除是否长登录
localStorage.setItem('$userLogin', '{}');
/**
* 关闭除了 login 外的所有窗口
* 因为原生 activity 活动(窗口)是以栈的形式存在,即,login 刚打开会被压入栈顶,之后打开的页面会压在它上面。
* 退出登录逻辑:
* 退出登录时只保留栈顶 login(入口页面及当前页面的 webview),其他的都页面 close ,如果当前的如果也被 close 的话,
* 那么本页面的 js 就不会执行了,循环就会终端,会出错。这时候只剩下 login 与 currentWebview ,这样还不行,还要等本
* 循环关闭 webview 的 js 代码执行完后再把 currentWebview 关闭,这样小只剩下 login(入口页面)了,自然而然,登录
* 页面就显示出来了。虽然显示出来了,但是只是加载了 html 与 css 的样式,js 并没有加载,所以还要做其他处理,具体看下面的
* 实施方法。
* 具体实施:
* 1、用 plus.webview.all() 方法获取所有窗口的 webview 对象。
* 2、获取当前 webview 对象。
* 3、用 webviewObj.reload()方法重新加载一下 login 页面,这样 js 也有了。
* 4、循环所有窗口对像的数组(这里奇怪了,数组的第1个居然是入口页面....,与栈不符,就是写死了,为了防止
* 以后的变化造成措手不及,还是手动去获取一下“入口页面”的 url 然后再跟数组里每一个窗口对象的 url 进行对比,相等就
* 跳过本次循环,避免入口页面也被关闭掉。)关闭不想干的窗口。
* 5、关闭当前 webview 页面(窗口)
*/
// 获取所有Webview窗口
var all = plus.webview.all();
//获取当前页面
var currentWebview = plus.webview.currentWebview();
//获取入口页面的 url 地址
var entranceWebviewUrl = plus.webview.getWebviewById(plus.runtime.appid).getURL();
//重新加载 login 窗口
all[0].reload(true);
for(var i = 0; i < all.length; i++) {
if(entranceWebviewUrl == all[i].getURL()){
continue
}
if(currentWebview.getURL() != all[i].getURL()) {
all[i].close('none')
}
}
currentWebview.close('none')
})