从Android中的本地资产加载jQuery以获取远程html页面

时间:2014-07-08 13:04:33

标签: android jquery webview android-webview

我试图从Android网页浏览中读取存储在资源中的本地javascript文件(jQuery)。我不想加载base-url,因为我的图像和html是远程提供的。

总结: - 将本地jQuery(在assets文件夹中)加载到Android webview中的远程加载页面中。

经过长时间的浏览徒劳无功,我决定在这里提出这个问题。请帮忙。

谢谢!

3 个答案:

答案 0 :(得分:8)

  1. 定义一个类似下面的Javascript接口,它将从assets目录中读取你的jquery文件

    class JavaScriptInterface {
    
        @JavascriptInterface
        public String getFileContents(){
            return readAssetsContent("jquery.js");
        }
    }
    
  2. 更新WebView以启用JavaScript并添加先前定义的JavaScriptInterface ...

    webView.getSettings().setJavaScriptEnabled(true);       
    webView.addJavascriptInterface(new JavaScriptInterface(), "android");
    
  3. 在远程HTML中添加javascript代码段,通过android JavaScript界面​​读取jquery文件内容......

    <script type="text/javascript">
    var s = document.createElement('script');
    s.innerHTML = window.android.getFileContents();
    document.head.appendChild(s);
    
    //check if jquery is loaded now...
    if(typeof $ != "undefined") {
        $(document).ready(function() {
            $('body').css('background','green');
        });
    } else {
        document.body.innerText = "jQuery NOT loaded";
    }
    </script>
    

答案 1 :(得分:2)

首先,在您的Activity中,创建静态变量appContext,其中包含以下应用程序上下文和函数:

 //Initialize Application Context
 private static Context appContext;

 //Get Application Context (for use in external functions)
    public static Context getContext() {
        return appContext;
    }

...并在onCreate(Bundle savedInstanceState)中设置变量:

     //Set application context (for use in external functions)
     appContext = this;

第二次,在下面的单独文件中创建类:

文件:JavaScriptInterface.java

import android.content.Context;
import android.util.Log;
import android.webkit.JavascriptInterface;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;    

class JavaScriptInterface {        

    @JavascriptInterface
    public String getFileContents(String assetName){
        return readAssetsContent(MainActivity.getContext(), assetName);
    }

    //Read resources from "assets" folder in string
    public String readAssetsContent(Context context, String name) {
        BufferedReader in = null;
        try {
            StringBuilder buf = new StringBuilder();
            InputStream is = context.getAssets().open(name);
            in = new BufferedReader(new InputStreamReader(is));

            String str;
            boolean isFirst = true;
            while ( (str = in.readLine()) != null ) {
                if (isFirst)
                    isFirst = false;
                else
                    buf.append('\n');
                buf.append(str);
            }
            return buf.toString();
        } catch (IOException e) {
            Log.e("error", "Error opening asset " + name);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    Log.e("error", "Error closing asset " + name);
                }
            }
        }

        return null;
    }

}

第三次,不要忘记初始化您的Webview以使用JavaScriptInterface:

     //Set JS interface from JS/HTML code execution
     mWebView.addJavascriptInterface(new JavaScriptInterface(), "android");

第四,调用android方法getFileContents(),使用JavaScript加载HTML中的本地资源:

       <script type="text/javascript">
          var s = document.createElement('script');
          s.innerHTML = window.android.getFileContents('js/jquery.min.js');
          document.head.appendChild(s);

          //check if jquery is loaded now...
          if(typeof $ != "undefined") {
              $(document).ready(function() {
                    alert("jQuery is loaded!");
             });
          } else {
                alert("jQuery is NOT loaded!");
          }
       </script>

注意:此示例中的本地资源位于/assets/js/子文件夹中。

答案 2 :(得分:-2)

在我的html页面中,我刚刚添加了这样的标签。

<script type="text/javascript" src="file:///android_asset/jquery.js"></script>
<script type="text/javascript" src="file:///android_asset/englArrIni.js"></script>
<script type="text/javascript" src="file:///android_asset/point.js"></script>
<script type="text/javascript" src="file:///android_asset/dataManager.js"></script>

当你加载你自动加载所有js文件的url时。我想这对你很有帮助。