前几天,在项目中遇到一个BUG:
我们在Android工程中使用了WebView,打开一个网银支付url,点击支付的时候,他们会在网页中使用js弹出一个询问框,js代码如 下:
function testConfirm() {
if(confirm("pay or not?")) {
alert("yes! i do");
}
else
{
alert("no!!!");
}
}
我在webView没有对js这个事件进行处理,就导致流程不能正确执行下去了。
查了一下api,最后是这样解决了:
首先,设置webView属性:
mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
其次,设置WebChromeClient:
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage(message)
.setNeutralButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
}
}).show();
result.cancel();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url,
String message, final JsResult result) {
// TODO Auto-generated method stub
Log.i(TAG, "onJsConfirm" + "," + "url: " + url);
DialogUtils.dialogBuilder(mContext, "温馨提示", message,
new DialogCallBack() {
@Override
public void onCompate() {
Log.i(TAG, "onJsConfirm,onCompate");
result.confirm();
}
@Override
public void onCancel() {
Log.i(TAG, "onJsConfirm,onCancel");
result.cancel();
}
});
return true;
}
});
如此,webView中就可以捕获javascript的alert()、confirm()事件了。