簡體   English   中英

Webview不會加載javascript來獲取內容

[英]Webview does not load javascript to get content

我想在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");
  }
} 

為接口函數更新@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);
        }
    }

還有另一種方法可以做到這一點

 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");

要從Android調用JavaScript函數,您無需添加接口前綴:

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

注意:您必須在HTML頁面中實現被調用的javascript函數。 因此,如果您要在Web視圖中調用第三方網站,則只能訪問該頁面中的當前現有功能。

例如https://stackoverflow.com沒有名為INTERFACE.processContent JavaScript函數!

相反,當您想從javascript調用Android方法時,則需要該前綴:

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

最后,如果要處理第三方網頁的HTML內容,則不能使用Webview和JavaScript函數(該頁面中不存在)提取內容,但需要Android代碼來加載沒有WebView中介的網頁內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM