Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Android Webview加载javascript方法_Javascript_Android_Android Webview - Fatal编程技术网

从Android Webview加载javascript方法

从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

我正在尝试使用HighCharts在Android网络视图中呈现图表

我的应用程序应该很简单: -加载HTML页面和外部(但本地)css和js文件 -从应用程序的Java部分加载数据 -使用先前加载的数据作为参数调用javascript函数

我通过激活Javascript设置我的webview:

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();");
            }
        }
    });