安卓Webview中JavaScript无法工作?

103

我正在尝试制作一个相对简单的iOS应用的Android版本,该应用使用webview、一些按钮,然后依赖于对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应用和浏览器中都能正常工作,但是在我的应用程序中却不行!

请告诉我这是显而易见的问题...


35
为什么有人给我的问题投了反对票?我已经花了很多时间做研究,但还是没有找到答案,所以我认为我的问题非常合理 :/ - David K
1
我找到了一个回答这个问题的帖子android webview geolocation - yanddam
初学者也可以查看http://tutorials.jenkov.com/android/android-web-apps-using-android-webview.html,这里有许多关于WebView的技巧。 - CoolMind
12个回答

159

已解决!由于这个错误的刺激,我发现我需要设置

setDomStorageEnabled(true)

用于webview设置。

感谢你的帮助Stephan :)


63

如果在 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 内容的网页呢?如果没有特别说明,启用 JavaScript 又无法使用 DOM,那还有什么用呢。希望已经有人将此作为错误或改进/功能请求提出,并且相关人员正在处理。

还有一些被弃用的东西在某个地方腐烂,比如这个:

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)
}

谢谢,这真的很有帮助。 - ucMedia
当涉及到应用程序开发时,安卓如何在某些方面做得非常正确,而在某些方面又做得非常糟糕呢? - Moe
Xamarin Android 也有同样的问题,解决方案类似。谢谢。 - Luke Vo
+1 对于“the monkeys”。安卓团队真是太蠢了。需要 url(我写这个是因为 Stack Overflow 不让我评论)。 - Omid.N

13

主要来说,这三行代码就足以使JavaScript在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); 对我有效,谢谢! - Dani Gee

9

在Webview中加载JavaScript

webView.getSettings().setDomStorageEnabled(true);

7

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

这将帮助您启用js。

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

请不要忘记在AndroidManifest文件中设置该权限。
<uses-permission Android:name="Android.permission.INTERNET" />

它起作用了,我能够在“WebView”中运行JavaScript。 - zeeali
它起作用了,我可以在WebView中运行JavaScript。 - zeeali

6

你在清单文件中启用了正确的互联网权限吗?除此之外,一切看起来都很好。你有没有在真实的安卓手机上测试过这段代码?而不仅仅是在模拟器上?

这里有一个稍微不同的方法的好教程。你可以尝试一下,看看它是否适用于你。


1
我刚在我的三星Galaxy SII上尝试了一下,但没有成功。权限已在清单中添加:<uses-permission android:name="android.permission.INTERNET" /> 我会查看链接的 :) - David K
我已经下载了你提供的项目示例,它可以正常工作,但是添加我的URL仍然无法使用。奇怪的是,如果我只是在Android自带的浏览器中输入URL(而不是通过我的应用程序中的Webview),它就可以正常工作。太奇怪了... - David K
当您使用IP地址而不是域名时会发生什么?此外,您能否再次尝试使用域名,但这次使用普通的index.html页面呢?我已经没有更多的想法了。您可以与我们分享您正在使用的确切URL吗?如果不行也没关系,我只是想问问。我的下一步将是尝试检查您的Web应用程序返回的HTTP头响应代码。在某些方面,我并不惊讶股票浏览器可以工作,而您的URL加载却不能。互联网浏览器可以非常宽容。此外,这可能只是用户代理的问题。 - Stephan Branczyk
我已经使用原始URL更新了代码。内容是丹麦语,但这不应该成为问题。我将尝试检查HTTP代码,但由于该站点不是由我而是由朋友托管的,因此我无法访问IP地址,所以这将需要等待。 - David K
状态码为200,所以这不是问题。但我在logcat中发现了一个错误:ERROR/Web Console(661): TypeError: Result of expression 'localStorage' [null] is not an object. at http://slagterfriis.moski2.net/mobile/iphone/assets/script.js:16你知道这是什么意思吗? - David K

3
这个视频(http://youtu.be/uVqp1zcMfbE)给了我启示,让它能够正常工作。 关键是将你的 htmljs 文件保存在 Android 的 assets/ 文件夹中。 然后你就可以通过以下方式轻松访问它们:
webView.loadUrl("file:///android_asset/your_page.html");

2

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方法都改成了属性,除了SetSupportZoom,而SupportZoom仍然作为getter:/


2
如果您正在使用Kotlin,可以使用以下方法使JavaScript正常工作:
webView.apply {
     loadUrl(
         "file:///android_asset/frm/my_html_landing_page_here.html"
     )

     settings.javaScriptEnabled = true
     settings.domStorageEnabled = true
 }

同时确保你的整个文件夹都在Assets文件夹内(包括HTML、Javascript和其他所需文件)


1

只需允许您的WebView运行JS,就像这样简单:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接