【问题标题】:JavaScript not working in Android Webview?JavaScript 在 Android Webview 中不起作用?
【发布时间】:2011-11-24 18:41:25
【问题描述】:

我正在尝试制作一个相对简单的 iOS 应用的 Android 版本,它使用 web 视图、一些按钮,然后依赖于对 CMS 的 javascript 调用。

但是我被困在一个相当早期的开发点:webview 不能与 javascript 一起使用。我已经阅读了很多关于如何在 Android webview 中启用 JS 的帖子,但到目前为止还没有运气。

下面是我的一些代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(new WebChromeClient());
    mWebView.setWebViewClient(new HelloWebViewClient()
    {
        @Override  
        public void onPageFinished(WebView view, String url)  
        {  
            //Calling an init method that tells the website, we're ready 
            mWebView.loadUrl("javascript:m2Init()");
            page1(mWebView);
        }  
    });
  mWebView.loadUrl("http://my_url/mobile/iphone//app.php");  
}

private class HelloWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

public void page11(View view)
{
    mWebView.loadUrl("javascript:m2LoadPage(1)");
}

我在这里做错了什么? 该 URL 在我的 iOS 应用程序和浏览器中运行良好。 但不在我的应用程序中!

请告诉我这很明显......

【问题讨论】:

标签: javascript android webview


【解决方案1】:

已修复! 在错误的刺激下,我发现我需要设置

setDomStorageEnabled(true)

用于 webview 设置。

感谢您的帮助斯蒂芬:)

【讨论】:

  • +1 虽然我没有收到“localStorage 错误”,但启用 Dom 存储以显示页面所缺少的内容。
  • 为什么,它具体有什么作用?
  • @ElijahSaounkine,我修正了你的错误。 :)
  • mWebView.getSettings().setDomStorageEnabled(true); 因为愚蠢的我第一次尝试mWebView.setDomStorageEnabled(true);
  • 你拯救了我的一天。
【解决方案2】:

如果 Android 上的 WebView 无法正常工作,我总是会尝试确保设置了这些疯狂的标志,例如,

    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setLoadWithOverviewMode(true);
    webSettings.setUseWideViewPort(true);
    webSettings.setBuiltInZoomControls(true);
    webSettings.setDisplayZoomControls(false);
    webSettings.setSupportZoom(true);
    webSettings.setDefaultTextEncodingName("utf-8");

我想知道为什么默认情况下没有设置这些,现在谁会期望没有 javascript 内容的网页,以及当 DOM 不可用时启用 javascript 有什么用,除非指定。希望有人已经将此作为错误或改进/功能请求提交,并且猴子正在努力。

然后有一些不推荐使用的东西在某处腐烂,就像这样:

webView.getSettings().setPluginState(PluginState.ON);

所有这些都是为了在应用程序中加载网页。

在 iOS 上,一切都那么简单 - Swift 3.0

private func openURLWithInAppBrowser(urlString:String) {
    guard let url = URL(string:urlString) else {
        return
    }
    let sfSafari = SFSafariViewController(url:url)
    present(sfSafari, animated: true, completion: nil)
}

【讨论】:

  • 谢谢,真的很有帮助。
  • 在应用开发方面,Android 如何做到如此正确和如此错误。
  • Xamarin Android 也有同样的问题,解决方法也差不多。谢谢。
【解决方案3】:

在 webview 中加载 javascript

webView.getSettings().setDomStorageEnabled(true);

【讨论】:

    【解决方案4】:

    您是否在清单中启用了正确的互联网权限?否则一切看起来都很好。有没有机会,您是否也在实际的 Android 手机上测试过此代码?不只是在模拟器上?

    这是good tutorial,方法略有不同。您可能想尝试一下,看看它是否适合您。

    【讨论】:

    • 我刚刚在我的三星 Galaxy SII 上尝试过,但没有成功。权限在清单中添加为: 我将给链接看看:)
    • 我已经下载了您链接的项目的示例,它可以工作,但是添加我的 URL 仍然不行。奇怪的是,如果我只是在 androids 自己的浏览器中输入 url(而不是通过我的应用程序中的 webview),它就可以工作。好奇怪..
    • 用ip地址号代替域名会怎样?另外,你可以用域名再试一次,但这次用一个普通的 index.html 页面代替吗?我的想法不多了。您能与我们分享您使用的确切网址吗?如果没有,那没关系。我只是想我会问。我的下一步是尝试检查您的 Web 应用程序返回的 http 标头响应代码。在某些方面,我并不惊讶股票浏览器可以正常工作,而您的 url 加载却不能。互联网浏览器可以令人难以置信的宽容。此外,它可能只是一个用户代理。
    • 我已经用原始 URL 更新了代码。内容是丹麦语,但这不重要。我会尝试检查 http 代码,但无法访问该 ip,因为该网站不是我托管的,而是一个朋友托管的,所以必须等待。
    • Statuscode 是 200,所以这不是问题。但是我在 logcat 中发现了一个错误:ERROR/Web Console(661): TypeError: Result of expression 'localStorage' [null] is not an object。 slagterfriis.moski2.net/mobile/iphone/assets/script.js:16 知道这意味着什么吗?
    【解决方案5】:

    在 MainActivity.java 中添加以下代码行

    它帮助我启用了 js

      webSetting.setJavaScriptEnabled(true);
      webView.setWebChromeClient(new WebChromeClient());
      webView.setWebViewClient(new WebViewClient());
    

    不要忘记 AndroidManifest 文件中的这个权限。

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

    【讨论】:

      【解决方案6】:

      主要是这三行就足以让Javascipt在webView中工作了……

      webSetting.setJavaScriptEnabled(true);
      webView.setWebChromeClient(new WebChromeClient());
      webView.setWebViewClient(new WebViewClient());
      

      如果在那之后它也不起作用,那么也添加下面的行。

      webSettings.setDomStorageEnabled(true);
      

      实际上,您需要 setJavaScriptEnabled() 和 setWebChromeClient(new WebChromeClient()) 才能使 JavaScript 工作。如果您只使用 webSetting.setJavaScriptEnabled(true);那就不行了。

      【讨论】:

      • webSettings.setDomStorageEnabled(true);为我工作,谢谢!
      【解决方案7】:

      这个视频 (http://youtu.be/uVqp1zcMfbE) 给了我让它发挥作用的提示。 关键是将您的htmljs 文件保存在Android assets/ 文件夹中。 然后您可以通过以下方式轻松访问它们:

      webView.loadUrl("file:///android_asset/your_page.html");
      

      【讨论】:

        【解决方案8】:

        如果您在 Kotlin 中,您可以使用以下方法使 JavaScript 正常工作:

        webView.apply {
             loadUrl(
                 "file:///android_asset/frm/my_html_landing_page_here.html"
             )
        
             settings.javaScriptEnabled = true
             settings.domStorageEnabled = true
         }
        

        还要确保您的整个文件夹都在 Assets 文件夹中(这包括 HTML、Javascript 和其他所需文件)

        【讨论】:

          【解决方案9】:

          Xamarin Android 也有同样的问题,WebView 不执行任何 Javascript。关注@computingfreak 的回答:

                  this.SetContentView(Resource.Layout.activity_main);
          
                  var webView = this.FindViewById<WebView>(Resource.Id.webView);
          
                  var webSettings = webView.Settings;
                  webSettings.JavaScriptEnabled = true;
                  webSettings.DomStorageEnabled = true;
                  webSettings.LoadWithOverviewMode = true;
                  webSettings.UseWideViewPort = true;
                  webSettings.BuiltInZoomControls = true;
                  webSettings.DisplayZoomControls = false;
                  webSettings.SetSupportZoom(true);
                  webSettings.DefaultTextEncodingName = "utf-8";
          

          奇怪的是,他们将所有 setter 方法更改为属性,除了 SetSupportZoomSupportZoom 保持为 getter :/

          【讨论】:

            【解决方案10】:

            只允许你的 WebView 运行 JS,就这么简单:

            WebView web=(WebView)findViewById(R.id.web);
            web.getSettings().setJavaScriptEnabled(true);
            

            【讨论】:

              【解决方案11】:

              要在 WebView 中启用 javascript 弹出窗口,需要设置 webChromeClient 并覆盖 openFileChooser 方法。

                  mWebview.setWebChromeClient(new WebChromeClient(){
                      // For Android 4.1+
                      @SuppressWarnings("unused")
                      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                          mUploadMessage = uploadMsg;
              
                          Intent i = new Intent(Intent.ACTION_GET_CONTENT);
              
                          i.addCategory(Intent.CATEGORY_OPENABLE);
                          i.setType(acceptType);
              
                          startActivityForResult(Intent.createChooser(i, "SELECT"), 100);
                      }
              
                      // For Android 5.0+
                      @SuppressLint("NewApi")
                      public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                          if (mUploadMessageArr != null) {
                              mUploadMessageArr.onReceiveValue(null);
                              mUploadMessageArr = null;
                          }
              
                          mUploadMessageArr = filePathCallback;
              
                          Intent intent = fileChooserParams.createIntent();
              
                          try {
                              startActivityForResult(intent, 101);
                          } catch (ActivityNotFoundException e) {
                              mUploadMessageArr = null;
              
                              Toast.makeText(activity,"Some error occurred.", Toast.LENGTH_LONG).show();
              
                              return false;
                          }
              
                          return true;
                      }
                  });
              

              并按如下方式处理 onActivityResult:

              @SuppressLint("NewApi")
              @Override
              public void onActivityResult(int requestCode, int resultCode, Intent data) {
                  if (requestCode == 100) {
                      if (mUploadMessage == null) return;
                      Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();
                      mUploadMessage.onReceiveValue(result);
                      mUploadMessage = null;
                  }
              
                  else if (requestCode == 101) {
                      if (mUploadMessageArr == null) return;
                      mUploadMessageArr.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
                      mUploadMessageArr = null;
                  }
              
              }
              

              【讨论】:

                【解决方案12】:

                如果以上没有任何帮助尝试在 WebViewClient.onPageFinished 监听器中添加延迟

                override fun onPageFinished(view: WebView?, url: String?) {
                            Handler().postDelayed({
                                //update your view with js here
                                super.onPageFinished(view, url)
                            }, 1000)
                        }
                

                【讨论】:

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