我曾尝试在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中的测试函数。
这就是我迷失的地方。我尝试了3个不同的测试函数,但没有一个函数像我期望的那样运行。
我从包装在CDATA中的字符串资源中加载它们:
webView.loadDataWithBaseURL("", getResources().getString(R.string.test_html),
"text/html; charset=utf-8", "UTF-8", null);
测试版本1,单引号“ ”
<html>
<script type="text/javascript">
function test(){
console.log('test');
</script>
</head>
</body>
</html>
Logcat输出:
测试D/控制台输出:
ReferenceError:未定义测试
测试版本2,双引号“ ”
<html>
<script type="text/javascript">
function test(){
console.log("test");
</script>
</head>
</body>
</html>
Logcat输出:
测试D/控制台输出:
(){console.log(测试);}
版本3,双引号"testme"
<html>
<script type="text/javascript">
function test(){
console.log("testme");
</script>
</head>
</body>
</html>
Logcat输出:
D/控制台输出:未捕获ReferenceError:未定义testme
最后一个对我来说特别奇怪,为什么需要定义"testme“呢?这就是我想要发送到日志中的东西?
为什么要这样做,以及如何在安卓上正确执行JavaScript,有什么想法吗?谢谢!
发布于 2018-06-20 08:41:59
是的,经过一段时间的努力之后,我发现了为什么它不能工作在一些试验和错误之后。
我不知道为什么,但即使封装在CDATA包装器中,loadDataWithBaseURL也不喜欢在其第二个参数中的任何位置使用单引号或双引号。
所以,这不起作用,
<html>
<script type="text/javascript">
function test(){
console.log("test");
</script>
</head>
</body>
</html>
但是,,这是可行的
<html>
<script type=\"text/javascript\">
function test(){
console.log(\"test\");
|
|
强健的煎饼果子 · pycharm社区版可以写爬虫吗? - 知乎 2 年前 |