评估Javascript是如何工作的?

2023-11-21

我正在尝试使用新的评估JavascriptAndroid 4.4 中的方法,但我得到的只是一个空结果:

webView1.evaluateJavascript("return \"test\";", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Log is written, but s is always null
    }
});

如何向该方法返回结果?

Update:更多信息:

  1. 我已设置 INTERNET 权限
  2. I have setJavascriptEnabled(true);
  3. 尝试过撇号字符串:return 'test';,
  4. 尝试过 JS 对象:return { test: 'this' }
  5. console.log('test');正在被很好地执行。
  6. Set targetSdkVersion至 19,如下:如果您的应用程序使用 WebView

Devices:Nexus 7 和 Nexus 5(库存)


本示例中有一个使用valuateJavascript方法的示例:

https://github.com/GoogleChrome/chromium-webview-samples/tree/master/jsinterface-example

本质上,如果您在 WebView 中执行的 javascript 返回一个值,它将在回调中传递。

主要需要注意的是,OnReceiveValue 中返回的字符串是 JSON 值、JSON 对象或 JSON 数组,具体取决于您返回的内容。

需要注意的是,如果返回单个值,则需要在 JSON 读取器上使用 setLenient(true) 才能正常工作。

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        // In KitKat+ you should use the evaluateJavascript method
        mWebView.evaluateJavascript(javascript, new ValueCallback<String>() {
            @TargetApi(Build.VERSION_CODES.HONEYCOMB)
            @Override
            public void onReceiveValue(String s) {
                JsonReader reader = new JsonReader(new StringReader(s));

                // Must set lenient to parse single values
                reader.setLenient(true);

                try {
                    if(reader.peek() != JsonToken.NULL) {
                        if(reader.peek() == JsonToken.STRING) {
                            String msg = reader.nextString();
                            if(msg != null) {
                                Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
                            }
                        }
                    }
                } catch (IOException e) {
                    Log.e("TAG", "MainActivity: IOException", e);
                } finally {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        // NOOP
                    }
                }
            }
        });
    }

您可能仍想对字符串响应使用解析器的原因是它被转换为 JSON 值,这意味着它将用引号括起来。

例如,如果您去了:

mWebView.evaluateJavascript("(function() { return 'this'; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints: "this"
    }
});

它将打印字符串 this,用双引号括起来:“this”。

其他值得注意的例子:

mWebView.evaluateJavascript("(function() { return null; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints the string 'null' NOT Java null
    }
});

mWebView.evaluateJavascript("(function() { })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); //s is Java null
    }
});

mWebView.evaluateJavascript("(function() { return ''; })();", new ValueCallback<String>() {
    @Override
    public void onReceiveValue(String s) {
        Log.d("LogName", s); // Prints "" (Two double quotes)
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

评估Javascript是如何工作的? 的相关文章

随机推荐