WebView加載Github工程時直接進(jìn)入README界面的幾種方式

前言

在開發(fā)KeepGank的過程中遇到了一個問題,就是Github的手機(jī)版本網(wǎng)頁進(jìn)入時會是這個樣子。

比如打開RxJava的網(wǎng)頁會是這個樣子,路徑為:https://github.com/ReactiveX/RxJava

而我希望用戶點開我的鏈接后進(jìn)入的直接是以下界面。因為手機(jī)直接看README比較直觀,不需要先進(jìn)入那么復(fù)雜的界面、
以下路徑為:https://github.com/ReactiveX/RxJava/blob/2.x/README.md

而用戶的點擊界面是這樣的:

image.png

那么面臨一個問題,如何讓W(xué)ebView加載https://github.com/ReactiveX/RxJava時加載到https://github.com/ReactiveX/RxJava/blob/2.x/README.md路徑。

方案一

我們可以首先直接使用http獲取到https://travis-ci.org/ReactiveX/RxJava/的網(wǎng)頁源碼,而其中是有README的跳轉(zhuǎn)路徑的,分析完HTML數(shù)據(jù)便可以找到目的URL。

<div class="bubble-actions">
    <a href="/ReactiveX/RxJava/blob/2.x/README.md" class="bubble-action">
      View all of README.md
    </a>
</div>

這便是html代碼里面README.md的路徑了。
之后我們可以讓WebView加載https://github.com + /ReactiveX/RxJava/blob/2.x/README.md 路徑就可以了。

這個方案有個缺點,前面需要分析HTML,且分析HTML就要用到jsoup包, 為了這么個需求就要用到一個包實在是不情愿,而且預(yù)加載html的時候還要浪費時間。

更坑爹的是,若有工程沒有README.md 那么我們只能加載原來的路徑,那中間這些分析過程都白分析了。

方案二

通過WebView的JavascriptInterface 回調(diào),能夠拿到WebView的html,做到了先顯示后拿到數(shù)據(jù)分析再顯示的效果。代碼如下,不過缺點還是需要去分析HTML文本。這個分析代碼是煩人的,我這么懶得人不想寫,因為這肯定占據(jù)很大內(nèi)存在分析html,涉及到太多的字符串匹配。

         mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");  
         mWebView.setWebViewClient(new WebViewClient() {  
            @Override  
            public void onPageStarted(WebView view, String url, Bitmap favicon) {  
                super.onPageStarted(view, url, favicon);  
            }  
  
            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {  
                view.loadUrl(url);  
                return true;  
            }  
  
            @Override  
            public void onPageFinished(WebView view, String url) {  
                super.onPageFinished(view, url);  
                view.loadUrl("javascript:window.local_obj.showSource('<head>'+"  
                        + "document.getElementsByTagName('html')[0].innerHTML+'</head>');");  
  
            }  
  
            @Override  
            public void onReceivedError(WebView view, int errorCode,  
                    String description, String failingUrl) {  
                super.onReceivedError(view, errorCode, description, failingUrl);  
            }  
  
        });  
    }  
      
    final class InJavaScriptLocalObj {  
        public void showSource(String html) {  
            System.out.println("====>html="+html);  
        }  
    }  

方案三

我們是可以通過WebViewClientonPageFinished加載js代碼的,上面的方法二也是通過加載js回調(diào)Java的方式來獲取html的。既然能加載JS我們大可以用JS來解決這事情。

我們再次查看HTML代碼。是一個class="bubble-actions"包裹了class="bubble-action",內(nèi)容data為"View all of README.md". 這三個因素決定了這個href 才是目標(biāo)路徑。因為bubble-actions這些class該網(wǎng)頁中有好多個。

<div class="bubble-actions">
    <a href="/ReactiveX/RxJava/blob/2.x/README.md" class="bubble-action">
      View all of README.md
    </a>
</div>

那么我們的js代碼可以這么寫。。。我這渣渣js

    var myParagragh = document.getElementsByClassName("bubble-actions"); 
    console.log("myParagragh length:", myParagragh.length);
    for (var i = myParagragh.length - 1; i >= 0; i--) {
        var a = myParagragh[i].getElementsByClassName("bubble-action");
        if (a.length > 0) {
            console.log("action:", a[0]);
            console.log("action:", a[0].firstChild.data);
            if (a[0].firstChild.data.indexOf("View all of README.md") > 0){
                    console.log("ok");
                        window.location.href=a[0].href;
             }
        }
    }

我們先通過classname獲取到一個list,再遍歷這個list里面若有bubble-action元素,再去判斷data是否為README.md。若是的話直接獲取其href 并賦值給window.location.href即可以實現(xiàn)。

通過這種方式,當(dāng)我們點開一個工程時,便直接進(jìn)去的是它的README界面啦。因為手機(jī)端還是直接看README比較直觀


本文作者:Anderson大碼渣/Jerey_Jobs
博客地址 : http://jerey.cn/
簡書地址 : Anderson大碼渣
github地址 : https://github.com/Jerey-Jobs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,099評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,491評論 2 45
  • 軟件名稱:簡看影視 軟件版本:2.0 軟件介紹: 本軟件支持在線播放全網(wǎng)90%的影視資源,包括各大影視平臺的vip...
    AY_Nopi閱讀 325評論 0 0
  • 我一直以為 我在你心上灑的那粒種子 已經(jīng)開成了一朵美麗的花 也一直以為 你會像小王子那樣 好好的守護(hù)著那朵紅玫瑰 ...
    桔樹上閱讀 215評論 1 2
  • 育兒反思5:讓孩子承受自然結(jié)果 22個月的兒子不再滿足于別人的包辦代替,他的自主意識越來越強(qiáng),他要自己來。他搶過我...
    魯一禾閱讀 267評論 0 1