JavaScript无法在Android Webview中使用?


78

我正在尝试制作一个相对简单的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应用和浏览器中运行良好。但是不在我的应用程序中!

请告诉我这很明显...


28
嗯,为什么有人不赞成我的问题?我花了很多时间进行研究,但还没有发现任何东西,所以我想说我的问题很有效:/
David K

1
我发现了一个回答此问题的帖子[android webview地理位置] [1] [1]:stackoverflow.com/questions/5329662/…–
yanddam

初学者也可以参阅tutorials.jenkov.com/android/…,其中有许多有关WebView的技巧。
CoolMind

Answers:


125

固定!受错误的刺激,我发现我需要设置

setDomStorageEnabled(true)

用于Webview设置。

感谢您的帮助,斯蒂芬:)


+1尽管我没有收到“ localStorage错误”,但请启用Dom存储以显示该页面所缺少的内容。
momo

为什么,它具体做什么?
Francisco Corrales Morales 2014年

@ElijahSaounkine,我纠正了您的错误。:)
CoolMind '16

6
mWebView.getSettings().setDomStorageEnabled(true);自从我第一次尝试愚蠢以来mWebView.setDomStorageEnabled(true);
朱利安·本马

1
你救了我的日子。
奥马尔·哈桑

44

如果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,则在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)
}

谢谢,这真的有帮助。
ucMedia '19

在应用程序开发方面,Android如何才能正确无误。
Moe

Xamarin Android存在相同的问题,解决方案相似。谢谢。
路加福音


6

您是否在清单中启用了正确的Internet权限?否则一切看起来都很好。您有机会在实际的Android手机上测试此代码吗?不仅在模拟器上?

这是一个关于稍微不同的方法的很好的教程。您可能想尝试一下它是否适合您。


1
我刚刚在我的Samsung Galaxy SII上尝试过,没有运气。权限在清单中添加为:<uses-permission android:name =“ android.permission.INTERNET” />我将看一下链接:)
David K

我已经下载了您链接的项目的示例,该示例可以运行,但是添加我的URL仍然不可行。奇怪的是,如果我只是在android自己的浏览器中键入url(而不是通过我的应用程序中的webview),它就会起作用。真奇怪..
David K

当您使用IP地址号码而不是域名时会发生什么?另外,您可以使用域名再次尝试,但是这次使用普通的index.html页面代替吗?我的想法不多了。您可以与我们分享您正在使用的确切网址吗?如果没有,那没关系。我只是想问一下。我的下一步是尝试检查您的Web应用程序正在返回的http标头响应代码。在某些方面,我并不惊讶于库存浏览器可以工作,而您的URL加载却不起作用。互联网浏览器可能令人难以置信。同样,这可能只是用户代理。
Stephan Branczyk 2011年

我已经用原始URL更新了代码。内容是丹麦文,但这无关紧要。我将尝试检查http代码,但是由于该站点不是由我托管,而是由朋友托管,因此无法访问ip,因此必须等待。
David K

Statuscode是200,所以那不是问题。但是我在logcat中发现一个错误:ERROR / Web Console(661):TypeError:表达式'localStorage'[null]的结果不是对象。在slagterfriis.moski2.net/mobile/iphone/assets/script.js:16知道这是什么意思吗?
David K

3

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

它帮助我启用了js

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

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

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

2

该视频(http://youtu.be/uVqp1zcMfbE)给了我提示使其工作。关键是将htmljs文件保存在Androidassets/文件夹中。然后,您可以通过以下方式轻松访问它们:

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

6
资产而非资产
Hamid 2014年

2

主要地,这三行代码足以使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); 为我工作,谢谢!
Dani Gee

1

如果您在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

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:/


0

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

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

0

要在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;
    }

}

0

如果以上方法均无济于事,请尝试在WebViewClient.onPageFinished侦听器中添加延迟

override fun onPageFinished(view: WebView?, url: String?) {
            Handler().postDelayed({
                //update your view with js here
                super.onPageFinished(view, url)
            }, 1000)
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.