JavaScript 不能在 Android Webview 中工作?

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

拜托告诉我这很明显。

109644 次浏览

Did you enable the right internet permission in the manifest? Everything looks fine otherwise. By any chance, have you also tested this code on an actual Android phone? And not just on the emulator?

Here is a good tutorial on a slightly different approach. You may want to try that one to see if it works for you.

FIXED! Spurred on by the error, I found out that I needed to set

setDomStorageEnabled(true)

for the webview settings.

Thanks for your help Stephan :)

This video (http://youtu.be/uVqp1zcMfbE) gave me the hint to make it work. The key is to save your html and js files in the Android assets/ folder. Then you can easily access them via:

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

In case something with WebView on Android does not work, I always try to make sure I set these crazy flags such as,

    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");

I wonder why these are not set by Default, who would expect webpages without javascript content nowadays, and whats the use having javascript enabled when DOM is unavailable unless specified. Hope someone filed this as a bug or improvement/feature-request already and the monkeys are working on it.

and then there is deprecated stuff rotting somewhere, like this:

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

All this for loading webpages inside app.

On iOS, its all so simple - 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)
}

Loading javascript in webview

webView.getSettings().setDomStorageEnabled(true);

Just permit your WebView to run JS, simple like that:

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

To enable javascript popups in WebView its necessary to set webChromeClient and override openFileChooser methods.

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

And handle the onActivityResult as below:

@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;
}


}

Add the following lines of code in your MainActivity.java

It helped me to enable js

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

do not forget about this permission in AndroidManifest file.

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

If you are in Kotlin you can use the following method to get the JavaScript working :

webView.apply {
loadUrl(
"file:///android_asset/frm/my_html_landing_page_here.html"
)


settings.javaScriptEnabled = true
settings.domStorageEnabled = true
}

Also make sure that your entire folder is inside the Assets folder (this includes HTML, Javascript and other file needed)

If nothing above helped try to add delay in WebViewClient.onPageFinished listener

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

Xamarin Android also has the same problem that WebView does not execute any Javascript. Follow @computingfreak answer:

        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";

Weirdly enough they changed all setter methods to properties except SetSupportZoom and SupportZoom stays as getter :/

Mainly, these three lines will be enough to make the Javascipt work in webView...

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

If it's not working after that also, then add below line also.

webSettings.setDomStorageEnabled(true);

Actually, you need both setJavaScriptEnabled() and setWebChromeClient(new WebChromeClient()) to make the JavaScript work. If you will use only webSetting.setJavaScriptEnabled(true); then it won't work.