首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WebView evaluateJavascript的行为不可预测

WebView evaluateJavascript的行为不可预测
EN

Stack Overflow用户
提问于 2018-06-19 18:12:27
回答 1查看 453关注 0票数 0

我曾尝试在WebView中从我的Android代码中触发JavaScript函数,但没有成功。(我已经删除了本例中的所有杂物,但最终它需要是一个WebView,所以没有AndroidJSCore)

从我收集的信息来看,如果我只想单向执行(我的Java代码执行JavaScript代码),我不需要JavaScriptInterface,所以我将我的WebView设置如下:

代码语言:javascript
复制
webView.setWebChromeClient(new WebChromeClient() {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            Log.d("Console output", consoleMessage.message());
            return super.onConsoleMessage(consoleMessage);
        }
    });
webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                webView.evaluateJavascript("test();", null);
            } else {
                webView.loadUrl("javascript:test();");
            }
        }
    });
webView.getSettings().setJavaScriptEnabled(true);

这意味着当页面加载后,它应该触发JavaScript中的测试函数。

这就是我迷失的地方。我尝试了3个不同的测试函数,但没有一个函数像我期望的那样运行。

我从包装在CDATA中的字符串资源中加载它们:

代码语言:javascript
复制
webView.loadDataWithBaseURL("", getResources().getString(R.string.test_html),
            "text/html; charset=utf-8", "UTF-8", null);

测试版本1,单引号“

代码语言:javascript
复制
<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log('test');
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

测试D/控制台输出:

ReferenceError:未定义测试

测试版本2,双引号“

代码语言:javascript
复制
<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("test");
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

测试D/控制台输出:

(){console.log(测试);}

版本3,双引号"testme"

代码语言:javascript
复制
<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("testme");
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

D/控制台输出:未捕获ReferenceError:未定义testme

最后一个对我来说特别奇怪,为什么需要定义"testme“呢?这就是我想要发送到日志中的东西?

为什么要这样做,以及如何在安卓上正确执行JavaScript,有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 08:41:59

是的,经过一段时间的努力之后,我发现了为什么它不能工作在一些试验和错误之后。

我不知道为什么,但即使封装在CDATA包装器中,loadDataWithBaseURL也不喜欢在其第二个参数中的任何位置使用单引号或双引号。

所以,这不起作用,

代码语言:javascript
复制
<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("test");
        }
        </script>
    </head>
    <body>
    </body>
</html>

但是,,这是可行的

代码语言:javascript
复制
<html>
    <head>
        <script type=\"text/javascript\">
        function test(){
            console.log(\"test\");
        }
        </script>
    </head>
    <body>
    </body>
</html>

当然,在Java中创建字符串时,编辑器会显示您需要转义双引号,但是当将其创建为资源时,将其包装在CDATA中,然后随时加载它,这不会给出任何提示。

所以,希望有一天,这对某些人有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50925853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档