JavaScript 在 Android Webview 中不起作用?
Posted
技术标签:
【中文标题】JavaScript 在 Android Webview 中不起作用?【英文标题】:JavaScript not working in 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 应用程序和浏览器中运行良好。 但不在我的应用程序中!
请告诉我这很明显......
【问题讨论】:
呃,为什么有人反对我的问题?我花了很多时间研究但没有发现任何东西,所以我想说我的问题非常有效:/ 我找到了回答这个问题的帖子 [android webview geolocation][1] [1]: ***.com/questions/5329662/… 初学者也可以看tutorials.jenkov.com/android/…,关于WebView有很多tips。 【参考方案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 上尝试过,但没有成功。权限在清单中添加为:在 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) 给了我让它发挥作用的提示。
关键是将您的html
和js
文件保存在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 方法更改为属性,除了 SetSupportZoom
和 SupportZoom
保持为 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)
【讨论】:
以上是关于JavaScript 在 Android Webview 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章