运用js 封闭当前页面 , 平常想到的都是 window.close() , 然则该要领只能封闭经由过程 window.open() 翻开的页面
所以针对这类状况 , 只能分状况去处理 .
在微信 , 支付宝 , app 中翻开外部链接 , 都是运用webview翻开页面的 , 所以须要app供应映照要领 .
关于微信 , 支付宝 , 我们能经由过程开放平台找到对应的要领.
微信:
window.WeixinJSBridge.call('closeWindow')
支付宝:
window.AlipayJSBridge.call('closeWebview')
对应平常的app ,须要开发者封装能够让js挪用的要领 . (以下就是js 和 app的交互要领)
Javascript挪用Java要领
以Android的Toast的为例,下面看下怎样从Javascript代码中挪用体系的Toast。
先定义一个AndroidToast的Java类,它有一个show的要领用来显现Toast:
public class AndroidToast {
@JavascriptInterface
public void show(String str) {
Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
}
}
再对WebView举行设置,开启JavaScipt,注册JavascriptInterface的要领:
private void initView() {
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDefaultTextEncodingName("UTF-8");
webView.addJavascriptInterface(new AndroidToast(), "AndroidToast");
webView.loadUrl("file:///android_asset/index.html");
}
addJavascriptInterface的作用是把AndroidToast类映照为Javascript中的AndroidToast。如许就能够在JavaScript中挪用Java中的要领了。
在Javascript中挪用Java代码:
function toastClick(){
window.AndroidToast.show('from js');
}
经由过程window属性能够找到映照的对象AndroidToast,直接挪用它的show要领即可。
注重这里传输的数据只能是基础数据类型和string,能够传输string就意味着能够运用json传输结构化数据。
这里挪用的要领并没有返回值,假如须要在JavaScript中须要获得返回值怎么办呢?JavaScript挪用Java有返回值
假如想从Javascript调的要领内里获取到返回值,只须要定义一个带返回值的@JavascriptInterface要领即可:
public class AndroidMessage {
@JavascriptInterface
public String getMsg() {
return "form java";
}
}
增加Javascript的映照:
webView.addJavascriptInterface(new AndroidMessage(), “AndroidMessage”);
在JavaScript直接挪用:
function showAlert(){
var str=window.AndroidMessage.getMsg();
console.log(str);
}
如许就完成了有返回值的要领挪用。另有一种场景是,在Java中主动触发JavaScript要领,就须要在Java中挪用JavaScript要领了。Java挪用JavaScript要领
Java在挪用JavaScript要领的时刻,须要运用WebView.loadUrl()要领,它能够直接在页面里实行JavaScript要领。
起首定义一个JavaScript要领给Java挪用:
function callFromJava(str){
console.log(str);
}
在Java中直接挪用该要领:
public void javaCallJS(){
webView.loadUrl("javascript:callFromJava('call from java')");
}
能够在loadUrl中给Javascript要领直接传参,假如JavaScript要领有返回值,运用WebView.loadUrl()是没法获取到返回值的,须要JavaScript返回值给Java的话,能够定义一个Java要领供应给JavaScript挪用,然后Java挪用JavaScript以后,JavaScript触发该要领把返回值再传递给Java。
注重WebView.loadUrl()必须在Ui线程中运转,不然会会报错。
以下是项目中用到的详细代码:
var isLppzApp = false
var ua = navigator.userAgent.toLowerCase()
var uaApp = ua ? ua.match(/BeStore/i) : '' // match要领返回的是对象
var uaAndroid = /android/i.test(ua) // test返回的是true/false
var uaIos = /iphone|ipad|ipod/i.test(ua)
if (uaApp.toString() === 'bestore') { // 必须将match返回的对象转成字符串
isLppzApp = true
} else {
isLppzApp = false
}
if (window.WeixinJSBridge) {
window.WeixinJSBridge.call('closeWindow') // 微信
} else if (window.AlipayJSBridge) {
window.AlipayJSBridge.call('closeWebview') // 支付宝
} else if (isLppzApp && uaAndroid) {
window.obj.closePageLppzRequest('') // 安卓app
} else if (isLppzApp && uaIos) {
window.webkit.messageHandlers.closePageLppzRequest.postMessage('') //ios app
}