从Android Webview加载javascript方法
我正在尝试使用HighCharts在Android网络视图中呈现图表 我的应用程序应该很简单: -加载HTML页面和外部(但本地)css和js文件 -从应用程序的Java部分加载数据 -使用先前加载的数据作为参数调用javascript函数 我通过激活Javascript设置我的webview:从Android Webview加载javascript方法,javascript,android,android-webview,Javascript,Android,Android Webview,我正在尝试使用HighCharts在Android网络视图中呈现图表 我的应用程序应该很简单: -加载HTML页面和外部(但本地)css和js文件 -从应用程序的Java部分加载数据 -使用先前加载的数据作为参数调用javascript函数 我通过激活Javascript设置我的webview: mWebView.getSettings().setJavaScriptEnabled(true); 还可以通过设置WebClient来捕获javascript的控制台消息: mWebView.set
mWebView.getSettings().setJavaScriptEnabled(true);
还可以通过设置WebClient来捕获javascript的控制台消息:
mWebView.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d(TAG, cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
});
这是我的HTML页面:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="style.css" />
<title>Chart</title>
<script src="jquery.js"></script>
</head>
<body>
<script src="highstock.js"></script>
<script src="exporting.js"></script>
<script language="javascript">
function plot() {
console.log("Hello !");
}
</script>
<div id="container" style="height: 100%; width: 100%"></div>
</body>
</html>
我的外部CSS文件似乎已被读取,我想外部JS文件也已正确加载
我到处都读到我可以随时通过调用
mWebView.loadUrl("javascript:plot()");
然而,我总是得到错误
未捕获引用错误:未定义绘图--从null的第1行开始
有什么我可能忘记的吗?
注意,我加载页面并在loadUrl调用之后立即调用javascript方法
谢谢 试试这个:
<body>
<script src="highstock.js"></script>
<script src="exporting.js"></script>
<script language="javascript">
function plot() {
console.log("Hello !");
}
plot(); //Note the calling of the function within the HTML file once loaded into webView
</script>
<div id="container" style="height: 100%; width: 100%"></div>
</body>
如果要将数据传递给javascript函数,请通过如下URL发送数据:
mWebView.loadUrl("file:///android_asset/page.html?data=something");
和使用:
var param1var = getQueryVariable("data");
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
alert('Query Variable ' + variable + ' not found');
}
var param1var=getQueryVariable(“数据”);
函数getQueryVariable(变量){
var query=window.location.search.substring(1);
var vars=query.split(&);
对于(var i=0;i好的,我为您的时间损失感到抱歉。我花了几个小时寻找答案,然后在发布问题的15分钟内找到了解决方案
问题似乎是连续两次调用loadUrl。可能在我调用javascript函数时页面还没有正确加载
我在WebView上添加了一个负载侦听器,如下所示
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (url.equals("file:///android_asset/page.html")) {
mWebView.loadUrl("javascript:plot();");
}
}
});
因此,我只在页面完全加载时调用javascript方法。
现在它在每次通话中都能正常工作
再次感谢您的关注!这确实有效。但是,我将向plot()调用添加参数,这些参数将来自我的Java代码,因此我宁愿保留loadUrl()调用。或者有其他方法吗?这实际上应该有效,但每次我刷新数据时都会重新加载页面。我计划使用一个相当繁重的图表库,因此我宁愿避免每次添加单个数据进行绘图时都重新加载它。不过,感谢您使用此方法,它可能会在以后的另一个页面上对我有所帮助。连续调用loadUrl导致竞争条件。问题是loadUrl(“file://..)不会立即完成,因此当您调用loadUrl(“javascript:…”)时,它有时会在页面加载之前执行(因此它将在“about:blank”上下文中有效执行),从而导致错误。
var param1var = getQueryVariable("data");
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
alert('Query Variable ' + variable + ' not found');
}
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (url.equals("file:///android_asset/page.html")) {
mWebView.loadUrl("javascript:plot();");
}
}
});