我覆盖了我的WebChromeClient的onJsAlert行为,如:
WebChromeClient wvcc = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
//...
return true;
}
}
我的应用程序成功处理了Js警报并抑制了原始警报。但是,在警报事件之后,我无法在webview中的网页上单击我的按钮(在listview的列表项中)。 我目前正在使用jquery mobile来构建我的网站。
还有什么我应该知道的吗?
答案 0 :(得分:19)
我刚刚遇到了完全相同的问题。我想生成一个自定义的android对话框而不是警告,这是最终的解决方案:
myWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, final String url, String message,
JsResult result) {
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setMessage(message)
.setNeutralButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
}
}).show();
result.cancel();
return true;
}
});
关键是result.cancel();
和return true;
,我在几个组合中进行了测试,唯一一个没有触发默认JS警报并且没有引起触摸问题的是这个组合
答案 1 :(得分:2)
你应该调用result.confirm()方法,我的解决方案是:
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
Log.i("MainActivity", "onJsAlert url=" + url + ";message=" + message);
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
result.confirm();
return true;
}
答案 2 :(得分:2)
我也面临类似的问题(但在我的情况下使用onJsPrompt
)并且建议的解决方案对我不起作用。我已经从处理程序中调用了result.cancel()/result.confirm()
和return true
。修复的关键在JsDialogHelper
的源代码中找到。
这是我发现解决问题的路线:
builder.setOnCancelListener(new CancelListener());
完整的处理程序代码:
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result)
{
final EditText data = new EditText(view.getContext());
AlertDialog.Builder b = new AlertDialog.Builder(view.getContext())
.setTitle(view.getTitle())
.setView(data)
.setMessage(message)
.setOnCancelListener(new CancelListener(result)) // if this line is missing, WebView remains unresponsive after the dialog is shown and closed once
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
result.confirm(data.getText().toString());
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
result.cancel();
}
});
b.show();
return true;
}
其中CancelListener
可以定义为一个简单的存根类:
private class CancelListener implements DialogInterface.OnCancelListener,
DialogInterface.OnClickListener
{
CancelListener(JsResult result)
{
mResult = result;
}
private final JsResult mResult;
@Override
public void onCancel(DialogInterface dialog)
{
mResult.cancel();
}
@Override
public void onClick(DialogInterface dialog, int which)
{
mResult.cancel();
}
}
我不确定这是否是WebView中的错误,或必需始终定义了取消侦听器以保持webview的对话框正常工作。