我试图从Android网页浏览中读取存储在资源中的本地javascript文件(jQuery)。我不想加载base-url,因为我的图像和html是远程提供的。
总结: - 将本地jQuery(在assets文件夹中)加载到Android webview中的远程加载页面中。
经过长时间的浏览徒劳无功,我决定在这里提出这个问题。请帮忙。
谢谢!
答案 0 :(得分:8)
定义一个类似下面的Javascript接口,它将从assets目录中读取你的jquery文件
class JavaScriptInterface {
@JavascriptInterface
public String getFileContents(){
return readAssetsContent("jquery.js");
}
}
更新WebView以启用JavaScript并添加先前定义的JavaScriptInterface ...
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "android");
在远程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时。我想这对你很有帮助。