使用js 關閉當前頁面 , 通常想到的都是 window.close() , 可是該方法只能關閉經過 window.open() 打開的頁面 javascript
因此針對這種狀況 , 只能分狀況去解決 . html
在微信 , 支付寶 , app 中打開外部連接 , 都是使用webview打開頁面的 , 因此須要app提供映射方法 . java
對於微信 , 支付寶 , 咱們能經過開放平臺找到對應的方法.android
微信:ios
window.WeixinJSBridge.call('closeWindow')
支付寶:web
window.AlipayJSBridge.call('closeWebview')
對應通常的app ,須要開發者封裝可讓js調用的方法 . (如下就是js 和 app的交互方法)json
Javascript調用Java方法微信
以Android的Toast的爲例,下面看下如何從Javascript代碼中調用系統的Toast。
先定義一個AndroidToast的Java類,它有一個show的方法用來顯示Toast:app
public class AndroidToast { @JavascriptInterface public void show(String str) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); } }
再對WebView進行設置,開啓JavaScipt,註冊JavascriptInterface的方法:iphone
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 }