我正在用Android开发和应用程序,其中有一篇用跨隐窝用javascript和python编写的文章(这几乎等同于我在javascript中直接开发这个部分,但我无法完全控制事情是如何制作的)。Android在带有WebView的活动中显示该部分。启动它的相关java代码很简单
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
mWebView.loadUrl("file:///android_asset/AndroidWebView.html");
AndroidWebView.html
的相关部分与iOS成绩单演示相似。
<script type="module">
import * as my_app from "./target/my_app.js"; window.my_app = my_app;
</script>
该应用程序在模拟器上运行得很好,但在实际设备上,WebView拒绝加载javascript,并发出以下错误:
Failed to load module script: The server responded with a non-JavaScript MIME type of "". Strict MIME type checking is enforced for module scripts per HTML spec.
如果我通过将HTML更改为
<script type="text/javascript">
import * as my_app from "./target/my_app.js"; window.my_app = my_app;
</script>
这似乎适用于我页面的其他部分,这些部分是普通的javascript (而不是模块),显然它在Uncaught SyntaxError: Cannot use import statement outside a module
中失败了。
是否有一种方法可以强制后一个HTML成为一个模块,或者前者的HTML不会如此强烈地检查MIME类型?
看着WebView选项,我看不出任何似乎相关的东西。环顾四周,这个问题似乎正是由这只虫子引起的。
另一方面,在我看来,问题似乎是接受类型为"text/javascript"
或"module"
的HTML标记的语法,而不是同时使用两者(我尝试了,似乎只使用了第一个),而在语义上,两者都有理由。有没有解决办法,甚至是一个黑客两者兼而有之?我知道一种可以用于加载my_app.js
的黑客,但是它无法进一步加载其他模块( my_app.js
是这样做的)。因此,这是行不通的,除非有一个转接程序或其他东西,能够自动合并我的所有模块为一个。FWIW,这些模块是从Transcrypt的python生成的,所以必须是自动化的,而不是手动的。
PS:我不是HTML或javascript开发人员,这是我在这个领域的第一步,所以请不要怀疑我的猜测。
PPS:我理解为什么不在计算机上做任何这件事,而是启动服务器。这就是我对我的开发环境所做的。但是,对于Android应用程序中的一项活动,HTTP服务器似乎是一个过度的、令人头疼的问题(跟踪端口、潜在的更多故障模式(在浏览器或其他应用程序中可能可见)、额外的权限、额外的资源和电池使用,可能还有更多我没有考虑过的问题)。
发布于 2020-03-13 10:13:00
有些事你可以试试。
<!DOCTYPE html>
添加到index.html中,确保它是html 5。val webViewAssetLoader = WebViewAssetLoader.Builder()
.addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(context!!))
.build()
val webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? {
val interceptedWebRequest = webViewAssetLoader.shouldInterceptRequest(request.url)
interceptedWebRequest?.let {
if (request.url.toString().endsWith("js", true)) {
it.mimeType = "text/javascript"
}
}
return interceptedWebRequest
}
}
发布于 2020-03-17 14:26:15
我只是以一种更容易理解的方式(用Java而不是Kotlin)重申前面的答案。
<!DOCTYPE html>
使用html 5是最佳实践import androidx.webkit.WebViewAssetLoader;
如另一个问题所述 mWebView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
WebResourceResponse intercepted = assetLoader.shouldInterceptRequest(request.getUrl());
if (request.getUrl().toString().endsWith("js")) {
if (intercepted != null) {
intercepted.setMimeType("text/javascript");
}
}
return intercepted;
}
});
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.loadUrl("https://appassets.androidplatform.net/assets/AndroidWebView.html");
注意HTTPS (非文件)协议,以及缺少AllowFileAccessFromFileURLs
https://stackoverflow.com/questions/60588170
复制相似问题