安卓WebView使用loadDataWithBaseUrl方法时无法执行JavaScript

4
我正在尝试使用以下方法将数据加载到Android WebView中:
webview.loadDataWithBaseURL("", htmlcontent, "text/html", null, "");

一种方法从StringBuilder返回htmlContent,该方法填充html数据。

我已启用javascript并设置了以下webChromeClient:

webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient());
webview.addJavascriptInterface(new JSClass(), "Android");

我的JavaScript接口:

class JSClass {
    public void getHTMLContent(String html)
    {
        Log.i(Global.TAG, "HTMLContentReceived: "+html);
    }
}

我的html页面中的javascript代码:

<script type="text/javascript">
    var ele = document.getElementsByClassName('test');
    for(var i=0;i<ele.length;i++){
        ele[i].onclick = function(){
            window.Android.getHTMLContent(this.innerHTML);
        }
    }
</script>

但是某种原因,JavaScript没有返回任何值。对于loadData(url)工作正常,其中url是assets文件夹中的简单网页。请帮忙,提前感谢。

只需在您的活动中添加JavaScript,使用以下代码: webview.loadUrl("javascript://在此处输入您的JavaScript代码"); 在上述代码中的 webview.getSettings().setJavaScriptEnabled(true); 之后,它将平稳运行! 希望能对您有所帮助。 - raghavendra
1个回答

1

由于您正在加载动态生成的HTML,所以没有任何可用的baseURL可以使用。

因此,webview.loadData(htmlcontent, "text/html", null);应该足够了。

在Java代码中,Javascripts不会抛出任何异常。请记住,JS并不像Java代码那样类型安全/严格... 我的做法是在敏感的Javascript调用之间放置日志,以查看该行是否通过并检查值。由于您没有提供HTML,我将设置WebChomeClient并覆盖onConsoleMessage

webview.setWebChromeClient(new MyChromeClient());

private class MyChromeClient extends WebChromeClient {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            String message = consoleMessage.message() + " -- line " + consoleMessage.lineNumber();
            switch (consoleMessage.messageLevel()) {
            case ERROR:
                logErrorMessage(message);
                break;
            default:
                logInfoMessage(message);
                break;
            }
            return true;
        }

        private void logInfoMessage(String message) {
            Log.i("JSTag", message);
        }

        private void logErrorMessage(String message) {
            Log.e("JSTag", message);
        }


    }

从您的JavaScript中,您可以调用例如:console.log('check my value:' + (ele != null))。更多信息在此处
查看您的JavaScript代码,我无法理解this.innerHTML指向哪个点。

谢谢您的反馈,Gunar。我已经解决了问题,现在我的Webview可以响应用户的点击了。我面临的问题是,当用户点击包含表格的页面中的任何一行时,我会调用一个意图,根据该行中的某些单元格数据加载一些图像。第一次点击时它运行得很顺畅,但第二次点击时应用程序会在不给出任何错误的情况下关闭。我不明白为什么。这是因为图像消耗的内存吗(每个图像约为2MB,但当用户点击一行时,我只下载缩略图,大约为200kb)?我该如何解决这个问题? - raghavendra
作为第一条评论:每个StackOverflow(SO)问题都应该足够具体。一旦你提出了一个问题,如果你收到的答案对于那个问题是可以的,那么你就可以继续进行下一步。对于你当前的问题,我建议你开一个新的线程。但是,既然你已经开始了这个话题:一个200kb的图像在内存中占用的空间会比解压后多三倍左右。我认为你应该重新考虑你的应用程序正在做什么的策略。也许如果你能在一个新的SO问题中陈述你的实际问题,你可以得到更多的帮助。 - gunar
没问题,当前的问题还存在吗? - gunar
是的,它确实会。当用户在Web视图中单击一行时,我从服务器下载了许多图像缩略图(分辨率htwd:225300)。他查看缩略图并返回到Web视图,当他第二次单击任何行时,应用程序会关闭而不会出现任何错误。 - raghavendra
当应用程序关闭时,Logcat 中应该有一些有意义的信息。你能把它发出来吗? - gunar
嗨,Gunar,根据您的建议,我已经为这个问题打开了一个新的线程,请参考: http://stackoverflow.com/questions/17365693/android-app-closes-without-any-error-webview-javascript?noredirect=1#comment25207774_17365693 而且在logcat中也没有记录任何错误日志。 - raghavendra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接