代码之家  ›  专栏  ›  技术社区  ›  user1504495

WebView评估的javascript行为不可预测

  •  0
  • user1504495  · 技术社区  · 6 年前

    我试图从我的android代码中触发一个javascript函数,但没有成功。(对于这个例子,我已经消除了所有的混乱,但最终它需要是一个WebView,所以没有AndroidJScore)

    根据我所收集的,如果我只需要单向执行(我的Java代码执行JavaScript代码),我就不需要JavaScript接口,所以我就这样设置了我的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中的函数。

    这就是它失去我的地方。我试了3种不同的 测试 函数和它们的行为都不像我期望的那样。

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

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

    版本1,单引号“测试”

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

    logcat输出:

    D/console输出:未捕获引用错误:未定义测试

    版本2,双引号“测试”

    <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/console_160;输出:未捕获引用错误:未定义测试名称

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

    关于它为什么会这样做,以及如何从Android正确地执行javascript有什么想法吗?谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   user1504495    6 年前

    所以,

    <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>