js關閉當前頁面(支付寶,微信,app)

使用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
}
相關文章
相關標籤/搜索