WebView與JS的那些事:注入JS提取頁面圖片

上一篇博文中,我們大概瞭解了js與webview的一些交互,然而,在我們實際的應用中,更傾向於在android端對網頁做一些處理,今天帶給大家的是往頁面注入JS腳本,提取頁面上的圖片,然後通過另一個Activity顯示圖片。


首先來看看效果,提提神。

這裏寫圖片描述


首先我們來分析分析這麼做的一些處步驟:
1、查找網頁所有的圖片控件
2、給所有的圖片控件添加一個onClick點擊事件
3、點擊圖片的onClick事件是js調用android內部的方法,並將src帶給android
4、android實現跳轉頁面,加載src的圖片。


我們在網頁中設置一個圖片,一般都是用如圖的方式在頁面上顯示一個圖片,我們的最終目的是拿到img.jpg這個圖片鏈接,

這裏寫圖片描述

我們知道,一個頁面中會有很多很多的img標籤和src屬性,我們要全部拿到,必須使用js的getElementsByTagName方法。

<html>
    <body>
        <img src="img/lang.jpg" />
        <img src="img/chat-1.png" />
    </body>
    <script>
    function getImage(){
        var img = document.getElementsByTagName("img");
        for(var i = 0; i < img.length; i++) {
            var a = document.getElementsByTagName("img")[i];
            a.onclick = function() {
                alert(a.src);
            };
        }
     }
     getImage();
    </script>
</html>

效果

這裏寫圖片描述

我們通過getElementsByTagName去遍歷頁面的所有img標籤,返回的是一個數組類型,然後通過數組遍歷每一個節點,然後給每個節點添加一個onClick參數,並且設置點擊傳遞的參數爲src圖片鏈接,我們測試了一下,先用alert去顯示圖片的鏈接,發現正如自己所想,拿到了期待的值。


現在,我們要把這段js代碼放到android中去,我們既然要遍歷整個網頁,必須得在網頁全部加載完成的時候才能遍歷到數據,我們在上一篇說到webview的加載完成回調onPageFinished方法,現在我們把js代碼放到這個方法裏面去加載。

   @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //添加js代碼
                 view.loadUrl("javascript:function img(){" +
                        "var href=document.getElementsByTagName(\"img\");" +
                        "\t\t for(var i=0;i<href.length;i++){\n" +
                        "\t\t \t   var a=document.getElementsByTagName(\"img\")[i];\n" +
                        "\t\t \t   a.οnclick=function(){\n" +
                        "\t\t \t        window.jsAndroid.onShowImage(this.src)" +
                        "\t\t \t   };\n" +
                        "\t\t }" +
                        "}");
                //執行js函數
                view.loadUrl("javascript:img()");

原來網頁測試的alert替換成了調用原生代碼的操作,並將src傳遞給android onShowImage函數,我們再來看看onShowImage,

 class JSObject {

        @JavascriptInterface
        public void onShowImage(String src) {
            Intent intent = new Intent(MainActivity.this, ImageActivity.class);
            intent.putExtra("src", src);
            startActivity(intent);
        }
    }

該類特別簡單,就是拿這個鏈接跳轉另一個Activity去顯示,我此處用的是Glide去加載的url。

整體代碼

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWeb();
        initSetting();
         webView.addJavascriptInterface(new JSObject(), "jsAndroid");
         }
    private void initWeb() {
        webView = (WebView) findViewById(R.id.webview);
          webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                  view.loadUrl("javascript:function img(){" +
                        "var href=document.getElementsByTagName(\"img\");" +
                        "\t\t for(var i=0;i<href.length;i++){\n" +
                        "\t\t \t   var a=document.getElementsByTagName(\"img\")[i];\n" +
                        "\t\t \t   a.οnclick=function(){\n" +
                        "\t\t \t        window.jsAndroid.onShowImage(this.src)" +
                        "\t\t \t   };\n" +
                        "\t\t }" +
                        "}");
                view.loadUrl("javascript:img()");
                   }
        });
    }
 private void initSetting() {
        seting = webView.getSettings();
        seting.setJavaScriptEnabled(true);
        // 設置允許JS彈窗
        seting.setJavaScriptCanOpenWindowsAutomatically(true);
        //防止中文亂碼
        seting.setDefaultTextEncodingName("UTF-8");
        //設置webview的緩存
        seting.setCacheMode(WebSettings.LOAD_NO_CACHE);
    }

  class JSObject {
   @JavascriptInterface
        public void onShowImage(String src) {
            Intent intent = new Intent(MainActivity.this, ImageActivity.class);
            intent.putExtra("src", src);
            startActivity(intent);
        }
    }

ok,這樣就實現了所需要的效果了,主要還是js代碼的設計,下一篇,還有驚喜喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章