【问题标题】:Webview does not load javascript to get contentWebview 不加载 javascript 来获取内容
【发布时间】:2019-11-26 11:00:14
【问题描述】:

我想获取 url 的 body 标记中的所有文本,但它不起作用。我搜索了很多,但我找不到任何东西。我还添加了android.permission.INTERNET

那么问题是什么?

这是我的代码:

public class Activity_Main  extends Activity {

@SuppressLint("JavascriptInterface")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final WebView webView = (WebView) findViewById(R.id.webView);

    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);

    final TextView contentView = (TextView) findViewById(R.id.contentView);

    class MyJavaScriptInterface
    {
        private TextView contentView;

        public MyJavaScriptInterface(TextView aContentView)
        {
            contentView = aContentView;
        }

        @SuppressWarnings("unused")

        public void processContent(String aContent)
        {
            final String content = aContent;
            contentView.setText(content);
        }
    }

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText);");
        }
    });

    webView.loadUrl("https://stackoverflow.com");
  }
} 

【问题讨论】:

  • processContent 应该怎么做?该功能可能有问题。
  • 另加super.onPageFinished(view, url);
  • 添加了 super.onPageFinished(view, url);但不起作用。
  • processContent 是您的 html 页面或 Android 代码中的函数吗?
  • 在 android 代码中。我在 html 中什么都没有。

标签: javascript android webview


【解决方案1】:

为您的接口函数更新@JavascriptInterface 并检查

class MyJavaScriptInterface
    {
        private TextView contentView;

        public MyJavaScriptInterface(TextView aContentView)
        {
            contentView = aContentView;
        }

        @JavascriptInterface
        public void processContent(String aContent)
        {
            final String content = aContent;
            contentView.setText(content);
        }
    }

还有另一种方法可以做到这一点,这就是上面的 KITKAT

 webView.evaluateJavascript("alert('pass here some ...')", new ValueCallback<String>() {
       @Override
       public void onReceiveValue(String s) {

        }
    });

这是在android中执行js的更新解决方案

完整代码在这里

final WebView webView = (WebView) findViewById(R.id.webView);

    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);

    final TextView contentView = (TextView) findViewById(R.id.contentView);

    class MyJavaScriptInterface
    {
        private TextView contentView;

        public MyJavaScriptInterface(TextView aContentView)
        {
            contentView = aContentView;
        }

        @JavascriptInterface
        public void processContent(String aContent)
        {
            final String content = aContent;
            contentView.setText(content);
        }
    }

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new MyJavaScriptInterface(contentView), "INTERFACE");
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            super.onPageFinished(view,url);


            if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) {
                webView.evaluateJavascript("document.getElementsByTagName('body')[0].innerText", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String s) {
                        contentView.setText(s);
                    }
                });
            }
            else {
                webView.loadUrl("javascript:window.INTERFACE.processContent(document.getElementsByTagName('body')[0].innerText)");

            }


                       }
    });

    webView.loadUrl("https://stackoverflow.com");

【讨论】:

  • 它返回 null
  • 再次返回null
  • 我的错误再次检查
【解决方案2】:

要从 Android 调用 JavaScript 函数,您无需添加接口前缀:

webView.loadUrl("javascript:processContent(document.getElementsByTagName('body')[0].innerText);");

注意:您必须在您的 HTML 页面中实现调用的 javascript 函数。因此,如果您在 webview 中调用第三方网站,则您只能访问该页面中当前现有的功能。

例如 https://stackoverflow.com 没有名为 INTERFACE.processContent 的 JavaScript 函数!

相反,当您想从 javascript 调用 Android 方法时,您需要该前缀:

<script>INTERFACE.myAndroidMethod()</script>

最后,如果您想处理第三方网页的 HTML 内容,则无法使用 Webview 和 JavaScript 函数(该页面中不存在该函数)提取内容,但您需要 Android 代码在没有 WebView 中介的情况下加载网页内容.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多