Android web视图以随机顺序加载javascript/不加载

Android web view load javascript in random order / not loading

本文关键字:加载 javascript 顺序 随机 web 视图 Android      更新时间:2023-09-26

我使用的web视图有问题。用于正确渲染视图的javascript文件必须按特定顺序加载。在浏览器(chrome手机;safari桌面,…)上,它运行良好。

然而,在我的网络视图中,结果是不可预测的。

这是我最近失败的一次跑步:

HTML:

<!DOCTYPE html>
<html lang="en">
        <head>
                <title></title>
                <meta charset="utf-8">
                <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
                <style>
                        body {
                                font-family: Monospace;
                                background-color: #000;
                                color: #fff;
                                margin: 0px;
                                overflow: hidden;
                        }
                </style>
                </head>
        <body>
                <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
                <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
                <script src="js/script1.js"></script>
                <script src="js/script2.js"></script>
                <script src="js/script3.js"></script>
                <script src="js/script4.js"></script>
                ... More scripts...
        </body>
</html>

这是Java代码:

   mWebView = (WebView)findViewById(R.id.webView);
    mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    //mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.setHorizontalFadingEdgeEnabled(false);
    mWebView.setScrollbarFadingEnabled(false);
    mWebView.setVerticalFadingEdgeEnabled(false);
    mWebView.setOverScrollMode(View.OVER_SCROLL_NEVER);
    mWebView.loadUrl("http://192.168.1.24:8000/path/to/index.html");

问题是,随机地,javascript文件被解释为错误的顺序,或者只是没有加载。

根据我的理解,javascript必须按照声明顺序加载。

我错了吗?我能做些什么来改变这种行为吗?(除了将所有JS连接在一起。)

您的脚本将在网站上运行,但要使其在android上运行,您需要手动加载脚本。请参阅函数如何从资源加载脚本。

private void injectScriptFile(WebView view, String scriptFile) {
      InputStream input;
      try {
         input = getAssets().open(scriptFile);
         byte[] buffer = new byte[input.available()];
         input.read(buffer);
         input.close();
         // String-ify the script byte-array using BASE64 encoding !!!
         String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
         view.loadUrl("javascript:(function() {" +
                      "var parent = document.getElementsByTagName('head').item(0);" +
                      "var script = document.createElement('script');" +
                      "script.type = 'text/javascript';" +
         // Tell the browser to BASE64-decode the string into your script !!!
                      "script.innerHTML = window.atob('" + encoded + "');" +
                      "parent.appendChild(script)" +
                      "})()");
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }

参见此处示例

还要确保您启用了JS:

webSettings.setJavaScriptEnabled(true);

当然还有清单:

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