WebView evaluateJavascript表现不可预测

时间:2018-06-19 10:12:27

标签: javascript android android-webview

我试图在WebView中从我的Android代码触发JavaScript函数失败。 (我已经删除了这个例子的所有混乱,但最终它需要是一个WebView,所以没有AndroidJSCore)

从我收集的内容中,如果我只想要一种方式执行(我的Java代码执行JavaScript代码),我就不需要JavaScriptInterface,所以我设置了这样的WebView:

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中触发 test 函数。

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

我从包装在CDATA中的字符串资源加载它们,如下所示:

webView.loadDataWithBaseURL("", getResources().getString(R.string.test_html),
            "text/html; charset=utf-8", "UTF-8", null);

版本1,单引号'test'

<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log('test');
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

  

D /控制台输出:未捕获的ReferenceError:未定义测试

版本2,双引号“test”

<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("test");
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

  

D / Console输出:function test(){console.log(test); }

版本3,双引号“testme”

<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("testme");
        }
        </script>
    </head>
    <body>
    </body>
</html>

Logcat输出:

  

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

这最后一个对我来说非常奇怪,为什么需要定义“testme”?这就是我要发送到日志的内容吗?

关于它为什么会这样做以及如何从Android正确执行JavaScript的任何想法?谢谢!

1 个答案:

答案 0 :(得分:0)

是的,所以我将头撞了又一阵子后,我发现了经过反复试验后为什么它不起作用的原因。

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

因此,这不起作用

<html>
    <head>
        <script type="text/javascript">
        function test(){
            console.log("test");
        }
        </script>
    </head>
    <body>
    </body>
</html>

但是这确实有效

<html>
    <head>
        <script type=\"text/javascript\">
        function test(){
            console.log(\"test\");
        }
        </script>
    </head>
    <body>
    </body>
</html>

当然,在Java中创建字符串时,编辑器将显示您需要对双引号进行转义,但是在将其创建为资源时,将其包装在CDATA中,然后在任何时候加载都不会引起注意。 / p>

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