【问题标题】:android webview javascript not working with loadDataWithBaseUrlandroid webview javascript不适用于loadDataWithBaseUrl
【发布时间】:2013-06-20 06:03:57
【问题描述】:

我正在尝试使用将数据加载到 android webview 中

webview.loadDataWithBaseURL("", htmlcontent, "text/html", null, "");

一个方法从填充 html 数据的StringBuilder 返回 htmlContent。

我已启用 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 文件夹中的一个简单网页

请帮忙 提前致谢

【问题讨论】:

  • 已更正!!只需使用 webview.loadUrl("javascript://your javascript goes here") 在您的活动中添加 javascript;在 webview.getSettings().setJavaScriptEnabled(true) 之后;在上面的代码中,它工作顺利!希望有帮助

标签: javascript android android-webview


【解决方案1】:

您没有任何 baseURL 可供使用,因为您正在加载动态生成的 HTML。 因此,webview.loadData(htmlcontent, "text/html", null); 应该绰绰有余。

Javascript 不会在 Java 代码中抛出任何异常。请记住,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))。有关此here 的更多信息。

看着你的 JavaScript 代码,我不明白this.innerHTML 指向什么。

【讨论】:

  • 感谢您的反馈。我已经解决了这个问题,现在我的 webview 响应用户点击。我面临的问题是,当用户单击任何行时,我用一个包含表格 n 的页面加载我的 webview,我调用了一个意图,它根据该行中的某些单元格数据加载一些图像。它在第一次单击时运行顺畅,但应用程序在第二次单击时关闭而不会出现任何错误。我不明白,是不是因为图像消耗的内存(每个图像大约是 2MB bt i nly dwnld only thumbs,当用户单击一行时大约是 200kb)?如何解决dis?
  • 作为第一条评论:每个 StackOverflow (SO) 问题都应该足够具体。一旦你问了什么,如果你收到的那个问题的答案是好的,你继续前进。对于您当前的问题,我会打开另一个线程。但是,自从你开始它:考虑到它将被解压缩,一个 200kb 的图像将在内存中占用大约三倍的时间。我相信你应该重新考虑你的应用程序正在做什么的策略。如果您可以在新的 SO 问题中陈述您的实际问题,也许您可​​以获得更多帮助。
  • 没问题,现在的问题还成立吗?
  • 是的。当用户单击 webview 中的一行时,我从服务器下载了一些图像缩略图(分辨率 ht*wd:225*300),他查看了缩略图并返回到 webview,当他第二次点击任何一行时,应用程序关闭时没有任何错误
  • 当应用程序关闭时,Logcat 中应该会显示一些内容。可以发一下吗?
猜你喜欢
  • 2017-10-08
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2016-09-22
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多