首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >放松MIME类型在安卓的WebView?还是强迫普通javascript输入模块?

放松MIME类型在安卓的WebView?还是强迫普通javascript输入模块?
EN

Stack Overflow用户
提问于 2020-03-08 13:50:59
回答 2查看 2.7K关注 0票数 6

我正在用Android开发和应用程序,其中有一篇用跨隐窝用javascript和python编写的文章(这几乎等同于我在javascript中直接开发这个部分,但我无法完全控制事情是如何制作的)。Android在带有WebView的活动中显示该部分。启动它的相关java代码很简单

代码语言:javascript
运行
复制
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        mWebView.loadUrl("file:///android_asset/AndroidWebView.html");

AndroidWebView.html的相关部分与iOS成绩单演示相似。

代码语言:javascript
运行
复制
        <script type="module">
            import * as my_app from "./target/my_app.js"; window.my_app = my_app;
        </script>

该应用程序在模拟器上运行得很好,但在实际设备上,WebView拒绝加载javascript,并发出以下错误:

代码语言: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更改为

代码语言:javascript
运行
复制
        <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服务器似乎是一个过度的、令人头疼的问题(跟踪端口、潜在的更多故障模式(在浏览器或其他应用程序中可能可见)、额外的权限、额外的资源和电池使用,可能还有更多我没有考虑过的问题)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-13 10:13:00

有些事你可以试试。

  1. 通过将<!DOCTYPE html>添加到index.html中,确保它是html 5。
  2. 而不是使用file://...直接从系统加载文件您可以使用WebViewAssetLoader,这将返回mimetype https://developer.android.com/reference/kotlin/androidx/webkit/WebViewAssetLoader
  3. 如果这在webViewClient中不起作用,您可以拦截请求并手动添加文本/javascript mimetype:
代码语言:javascript
运行
复制
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
    }
}
票数 4
EN

Stack Overflow用户

发布于 2020-03-17 14:26:15

我只是以一种更容易理解的方式(用Java而不是Kotlin)重申前面的答案。

  1. 不确定这是否重要,但通过添加<!DOCTYPE html>使用html 5是最佳实践
  2. import androidx.webkit.WebViewAssetLoader;另一个问题所述
  3. 使用以下内容强制正确的MIME类型
代码语言:javascript
运行
复制
        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;
            }
        });
  1. 使用以下内容加载HTML
代码语言:javascript
运行
复制
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        mWebView.loadUrl("https://appassets.androidplatform.net/assets/AndroidWebView.html");

注意HTTPS (非文件)协议,以及缺少AllowFileAccessFromFileURLs

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60588170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档