【问题标题】:JavaScript alert not working in Android WebViewJavaScript 警报在 Android WebView 中不起作用
【发布时间】:2011-07-13 09:58:08
【问题描述】:

在我的应用程序中,我使用的是WebView,并且我使用的是JavaScript alert( ) 方法,但它不起作用,没有弹出窗口出现。

在我的清单文件中我添加了

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

在活动文件中我已经添加了

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/demo.html");

在我添加的布局xml文件中

<WebView 
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

任何线索如何在WebView 中启用完整的JavaScript?


更新

谢谢马克
html 文件中的 alert() 方法现在可以工作了:)。

现在WebView 有两个问题:
1:我在我正在加载的 html 文件中使用 &lt;textarea&gt; WebView ,并尝试在其中写入印地语字体,但是当我尝试编写印地语文本时,它显示为符号(矩形符号,如 [ ] ) .

当我在桌面上的 Firefox 浏览器中执行相同操作时,它工作正常。 任何线索如何在WebView 中为textarea 中的多种语言提供支持?

2:当我单击提交并尝试在另一个 java 脚本中打开 alert() 方法中的文本值时,它不起作用,这是否意味着即使使用了 WebChromeClient 它仅适用于当前加载的 html 页面,而不适用于从该页面调用的javascripts?

【问题讨论】:

  • 它是“JavaScript”,而不是“Java Script”、“java-script”或“Java script”(所有这些都出现在您的原始问题中)。我已经为你更正了。
  • @T.J.Crowder 我敢说它应该被称为 Javascript。
  • @KrisSelbekk:不。 :-) "JavaScript" 是 Oracle 的注册商标(必须热爱并购),并使用(经许可)by Mozilla 用于其实施。在这两种情况下, 都是大写的 S。这是该名称的唯一规范形式。当然,该语言的另一个名称是 ECMAScript(或 ES),但除了在谈论 ES5 时,没有人真正使用它。

标签: javascript android


【解决方案1】:

正如其他人指出的那样,需要设置 WebChromeClient 才能使alert() 工作。只需设置默认的 WebChromeClient() 就足够了:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());

感谢以下所有 cmets。包括表示您需要启用 JavaScript 的 John Smith。

【讨论】:

  • 是的,但大多数时候你想调整 WebChromeClient 的事件,所以......
  • 我终于设法通过在mWebView.setWebChromeClient(new WebChromeClient());行前添加mWebView.getSettings().setJavaScriptEnabled(true);使其工作
  • 别忘了加webview.getSettings().setJavaScriptEnabled(true);
【解决方案2】:

检查this链接,最后评论,你必须使用WebChromeClient来达到你的目的。

【讨论】:

  • 谢谢! webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } });
  • 你的评论对我有帮助.. 就像下面 Nikhil 的回答一样。
  • 像魅力一样工作。但是然后.... WebClient 是否比 WebChromeClient 有任何优势。
  • 这可能是一个愚蠢的问题,但无论如何:为什么要重写一个方法只调用具有相同参数的超级方法?
  • 别忘了加webview.getSettings().setJavaScriptEnabled(true);
【解决方案3】:
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
    }
});

【讨论】:

  • 这很好用,但是当我从 javascript 调用 prompt 时,它没有显示提示文本,而是显示“https://...的页面说:”完全打破了沉浸式嵌入在应用中的 WebView
【解决方案4】:

以下代码将起作用:

private WebView mWebView;
final Activity activity = this;

// private Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            activity.setProgress(progress * 1000);
        }
    });

    mWebView.loadUrl("file:///android_asset/raw/NewFile1.html");
}

【讨论】:

    【解决方案5】:

    你可以试试这个,它对我有用

    WebView wb_previewSurvey=new WebView(this); 
    
    
           wb_previewSurvey.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                //Required functionality here
                return super.onJsAlert(view, url, message, result);
            }
    
        });
    

    【讨论】:

      【解决方案6】:

      如果您希望对用户隐藏 URL,请显示如下所示的 AlertDialog。

      myWebView.setWebChromeClient(new WebChromeClient() {
      
                  @Override
                  public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                      Log.d(TAG, "onJsAlert url: " + url + "; message: " + message);
                      AlertDialog.Builder builder = new AlertDialog.Builder(
                              mContext);
                      builder.setMessage(message)
                              .setNeutralButton("OK", new OnClickListener() {
                                  @Override
                                  public void onClick(DialogInterface dialog, int arg1) {
                                      dialog.dismiss();
                                  }
                              }).show();
                      result.cancel();
                      return true;
                  }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 2014-07-31
        • 1970-01-01
        • 2011-10-02
        相关资源
        最近更新 更多