11

我已经覆盖了我的 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 来构建我的网站。

还有什么我应该注意的吗?

4

3 回答 3

23

我刚刚遇到了完全相同的问题。我想生成一个自定义的 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();and return true;,我测试了几种组合,唯一没有触发默认JS警报并且没有引起触摸问题的就是这个组合

于 2013-04-26T14:32:36.713 回答
3

你应该调用 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;
        }
于 2015-05-06T09:04:21.050 回答
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 的对话框正常工作。

于 2016-02-08T18:06:41.833 回答