通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

Android通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调分别拦截JS对话框 (即上述三个方法),得到他们的消息内容
prompt()可以返回任意类型的值,操作最全面方便、更加灵活;而alert()对话框没有返回值;confirm()对话框只能返回两种状态(确定 / 取消)两个值
实例:
pTest.html:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<button onclick="clickprompt()">prompt输入框</button>
<script>
function clickprompt(){
var result=prompt("js://demo?arg1=111&arg2=222");
alert("demo"+result);
}
function returnResult(result){
alert("result is"+result);
}
</script>
</body>
</html>
通过制定参数协议,不管是url还是message,到native拦截处理。native调用Js只有一种方式,就是使用loadUrl(js),为在Web 端定义好的javascript 函数
webView = findViewById(R.id.prompt);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webView.loadUrl("file:///android_asset/pTest.html");
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// 拦截输入框(原理同方式2)
// 参数message:代表promt()的内容(不是url)
// 参数result:代表输入框的返回值
Uri uri = Uri.parse(message); //假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)
if (uri.getScheme().equals("js")) {
if (uri.getAuthority().equals("demo")) {
System.out.println("js调用了android 的方法");
Set<String> connection = uri.getQueryParameterNames();
Iterator<String> iterable = connection.iterator();
while (iterable.hasNext()) {
String next = iterable.next();
String value = uri.getQueryParameter(next);
System.out.println("key" + next + "value" + value);
}
result.confirm("js调用了Android的方法成功了");
}
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
});
通过alert()和confirm()拦截的原理相同,此处不作过多讲述,拦截JS的警告框
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
return super.onJsAlert(view, url, message, result);
}
// 拦截JS的确认框
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}


总结:

网友评论