说明:
开发中遇到一个需要通过prompt来传值的情况。也就是通过捕获prompt弹出框的值,来显示在原生中,但是不弹出prompt框。
代码:
第一步:原生调用js代码
private WebView webView; webView.loadUrl("javascript:getParams()");
第二部:网页js弹框
function getParams() { window.prompt("测试"); }
第三部:原生拦截弹框,禁止弹框并且得到对应的值
private void init webView() { webView = new WebView(context); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true);//允许网页使用js webView.setWebChromeClient(new WebChromeClient() {//允许有alert弹出框 @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); webTitle = title; } /** * 处理alert弹出框 */ @Override public boolean onJsAlert(WebView view,String url, String message,JsResult result) { Log.d(LOG_TAG,"onJsAlert:"+message); // mReusultText.setText("Alert:"+message); /* //对alert的简单封装 new AlertDialog.Builder(PhoneTest.this). setTitle("Alert").setMessage(message).setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { //TODO } }).create().show(); */ result.confirm(); return super.onJsConfirm(view,url,message, result); } /** * 处理confirm弹出框 */ @Override public boolean onJsConfirm(WebView view, String url, String message, JsResult result) { Log.d(LOG_TAG, "onJsConfirm:"+message); mReusultText.setText("Confirm:"+message); //捕获弹框消息给原生赋值,相当于传值了 //对confirm的简单封装 new AlertDialog.Builder(PhoneTest.this). setTitle("Confirm").setMessage(message).setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { //TODO } }).create().show(); result.confirm(); return true; //如果采用下面的代码会另外再弹出个消息框,目前不知道原理 //return super.onJsConfirm(view, url, message, result); } /** * 处理prompt弹出框 */ @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) { Log.d(LOG_TAG,"onJsPrompt:"+message); mReusultText.setText("Prompt input is :"+message); result.confirm(); return super.onJsPrompt(view, url, message, message, result); } }); }
注释:
result.confirm() 和 return true 一起用,才能保证弹框不会出现。