使用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类,它有一个显示Toast的show方法:}然后设置WebView,打开JavaScript,注册JavascriptInterface方法:;webSettings.setDefaultTextEncodingName("UTF-8");webView.addJavascriptInterface(newAndroidToast(),"AndroidToast");webView.loadUrl("file:///android_asset/index.html");}addJavascriptInterface是映射AndroidToast类到Javascript中的AndroidToast。通过这种方式,可以从JavaScript调用Java中的方法。在Javascript中调用Java代码:functiontoastClick(){window.AndroidToast.show('fromjs');}可以通过window属性找到映射对象AndroidToast,直接调用它的show方法。注意这里传输的数据只能是基本数据类型和字符串,能够传输字符串意味着可以使用json来传输结构化数据。此处调用的方法不返回值。如果你需要在JavaScript中获取返回值怎么办?JavaScript调用Java是有返回值的如果想得到Javascript调用的方法的返回值,只需要定义一个@JavascriptInterface方法,有返回值即可:publicclassAndroidMessage{@JavascriptInterfacepublicStringgetMsg(){return"form爪哇”;}}添加Javascript映射:webView.addJavascriptInterface(newAndroidMessage(),"AndroidMessage");在JavaScript中直接调用:functionshowAlert(){varstr=window.AndroidMessage.getMsg();console.log(str);}这样就完成了有返回值的方法调用。另一种场景是,如果主动触发Java中的JavaScript方法,需要调用Java中的JavaScript方法。Java调用JavaScript方法Java调用JavaScript方法时,需要使用WebView.loadUrl()方法,可以直接在页面上执行JavaScript方法。首先定义一个从Java调用的JavaScript方法:functioncallFromJava(str){console.log(str);}直接在Java中调用这个方法:publicvoidjavaCallJS(){webView.loadUrl("javascript:callFromJava('callfromjava')");}可以直接在loadUrl中给Javascript方法传参。如果JavaScript方法有返回值,则无法使用WebView.loadUrl()获取返回值。如果需要JavaScript返回值给Java,可以定义一个Java方法提供给JavaScript调用,Java调用JavaScript后,JavaScript触发该方法并将返回值传递给Java。注意WebView.loadUrl()必须在Ui线程中运行,否则会报错。下面是项目中使用的具体代码:varisLppzApp=falsevarua=navigator.userAgent.toLowerCase()varuaApp=ua?ua.match(/BeStore/i):''//match方法返回对象varuaAndroid=/android/i.test(ua)//测试返回true/falsevaruaIos=/iphone|ipad|ipod/i.test(ua)if(uaApp.toString()==='bestore'){//match返回的对象必须转成字符串isLppzApp=true}else{isLppzApp=false}if(window.WeixinJSBridge){window.WeixinJSBridge.call('closeWindow')//微信}elseif(window.AlipayJSBridge){window.AlipayJSBridge.call('closeWebview')//支付宝}elseif(isLppzApp&&uaAndroid){window.obj.closePageLppzRequest('')//Android应用}elseif(isLppzApp&&uaIos){window.webkit.messageHandlers.closePageLppzRequest.postMessage('')//ios应用}
