Android通過getElementsByClassName快速隱藏WebView標(biāo)題和廣告

近日谎痢,在把某網(wǎng)站用WebView加載到App里面的時候漓帚,出現(xiàn)的一個問題「尘#看下圖

標(biāo)題和廣告.png

簡直了~帶著標(biāo)題還有廣告,簡直太糟糕了.而且占屏幕的空間都太大了,很不協(xié)調(diào).... 所以我們要將他們所在的div隱藏掉,首先我想到的是讓服務(wù)器的哥們重新定制一個頁面來顯示,但是...坑的是他們不管...嗚嗚嗚~~~
俗話說,靠人不如靠己,咱們自己來!!
首先讓我們看看加載網(wǎng)頁的代碼:

private WebView webView;
private WebSettings settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_main);
    webView = (WebView) findViewById(web);
   //獲取webview的setting
    settings = webView.getSettings();
     //設(shè)置WebView屬性笋妥,能夠執(zhí)行Javascript腳本
    settings.setJavaScriptEnabled(true);
   //支持緩存
    settings.setAppCacheEnabled(true);
    webView.setWebViewClient(new NoAdWebViewClient());
    //加載需要顯示的網(wǎng)頁
    webView.loadUrl("http://www.ftchinese.com/channel/commodity.html");
}

然后在火狐瀏覽器上通過Ctrl+shift+m打開手機(jī)版網(wǎng)頁(這里有一個坑,等下再表....),右擊"查看元素"的調(diào)試模式可以輕易的獲取到標(biāo)題的div


標(biāo)題的div

找到對應(yīng)的div了,怎么才能隱藏他吶??? 一般我們獲取某個div是通過getElementsById("xxx")來找到對應(yīng)的div,但是我們發(fā)現(xiàn)div上并沒有id這個屬性,怎么辦? 有辦法! 我們還可以根據(jù)class屬性通過document.getElementsByClassName("xxx")來找到我們想要的div元素(不懂的,自動補(bǔ)齊:http://www.runoob.com/jsref/met-document-getelementsbyclassname.html)
下面是繼承WebViewClient()實現(xiàn)隱藏標(biāo)題和廣告div的代碼:

public class NoAdWebViewClient extends WebViewClient {

    private Context context;    

    public NoAdWebViewClient(Context context) {
        this.context = context;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        String js = getClearAdDivJs(context);
        Log.v("adJs",js);
        view.loadUrl(js); //加載js方法代碼
        view.loadUrl("javascript:hideAd();"); //調(diào)用js方法
    }
    public String getClearAdDivJs(Context context) {
        String js = "javascript:function hideAd() {";
        Resources res = context.getResources();
        String[] adDivs = res.getStringArray(R.array.adBlockDiv);
        for (int i = 0; i < adDivs.length; i++) {
            //通過div的id屬性刪除div元素
            //js += "var adDiv"+i+"= document.getElementById('"+adDivs[i]+"');if(adDiv"+i+" != null)adDiv"+i+".parentNode.removeChild(adDiv"+i+");";
            //通過div的class屬性隱藏div元素
            js += "var adDiv" + i + "= document.getElementsByClassName('" + adDivs[i] + "');if(adDiv" + i + " != null)" +
                    "{var x; for (x = 0; x < adDiv" + i + ".length; x++) {adDiv" + i + "[x].style.display='none';}}";
        }
        js += "}";
        return js;
    }
}

在onPageFinished方法里調(diào)用的js方法整理后(為方便閱讀經(jīng)過處理):

javascript:function hidehideAd() {
    var adDiv0 = document.getElementsByClassName("o-nav__placeholder");
    if(adDiv0 != null){
        var x;
        for (x= 0; x< adDiv0 .length; x++) {
            adDiv0 [x].style.display = "none";
        }
    }
    var adDiv1 = document.getElementsByClassName("site-map");
    if(adDiv1 != null){
        var x;
        for (x= 0; x< adDiv1.length; x++) {
            adDiv1[x].style.display = "none";
        }
    }
    var adDiv2 = document.getElementsByClassName("bn-ph");
    if(adDiv2 != null){
        var x;
        for (x= 0; x< adDiv2.length; x++) {
            adDiv2[x].style.display = "none";
        }
    }
   ...
}

通過values文件夾下的arrays.xml去管理去要去掉的標(biāo)題和廣告div懊昨,遍歷adDiv的集合窄潭,組合成一段js代碼,注入到網(wǎng)頁中去掉廣告.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="adBlockDiv">
        <item>o-nav__placeholder</item>
        <item>site-map</item>
        <item>bn-ph</item>
        <item>story-theme</item>
        <item>story-action-placeholder</item>
        <item>story-box last-child</item>
        <item>bn-ph standard</item>
        <item>footer-container</item>
        <item>mpu-container</item>
        <item>mpu-container last-child</item>
    </string-array>
</resources>

網(wǎng)頁去掉標(biāo)題和廣告的效果如下:


完成效果.png

還有個問題,雖然這樣可以隱藏掉我們不想顯示的div,但是我們在onFinished()方法里去調(diào)用這段js代碼,就意味著要在網(wǎng)頁加載完成之后才來隱藏,出現(xiàn)的效果就是:剛開始還是會顯示標(biāo)題和廣告,等網(wǎng)頁加載完之后標(biāo)題和廣告會突然消失...(一個很不好的體驗...)
那我們怎么優(yōu)化吶?

public class NoAdWebViewClient extends WebViewClient {
    private Context context;
    private WebView webView;
    private boolean isClose;

    public NoAdWebViewClient(Context context,WebView webView) {
        this.context = context;
        this.webView = webView;
    }


    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        if(isClose){ //如果線程正在運(yùn)行就不用重新開啟一個線程了
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                isClose = true;
                while (isClose){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(0x001);
                }
            }
        }).start();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String js = getClearAdDivJs(context);
            Log.v("adJs",js);
            view.loadUrl(js); //加載js方法代碼
            view.loadUrl("javascript:hideAd();"); //調(diào)用js方法
        }
    };

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        isClose = false;
    }

}

在NoAdWebViewClient里面我們重寫onPageStarted方法酵颁,因為Android機(jī)制不允許在主線程做耗時和在子線程更新UI,所以我們開啟一個線程嫉你,每100毫秒的循環(huán)注入js,并且利用Handler去注入js.然后在onPageFinished內(nèi)關(guān)閉線程.這樣之后躏惋,即使網(wǎng)絡(luò)很慢幽污,在沒有回調(diào)onPageFinished的時候,也不會出現(xiàn)廣告了簿姨。

總結(jié):
第一點 : 上面javaScript方法中:
getElementsByTagName("xxx")是通過標(biāo)簽的名稱獲取,結(jié)果是一個標(biāo)簽數(shù)組
getElementsByClassName("xxx")是通過標(biāo)簽上定義的class屬性獲取,結(jié)果是一個標(biāo)簽數(shù)組
getElementById("xxx")是通過標(biāo)簽上定義的id屬性獲取,結(jié)果是單個標(biāo)簽

獲取標(biāo)簽.png

第二點 : 為什么要用火狐瀏覽器打開手機(jī)版的網(wǎng)頁?
因為手機(jī)加載的網(wǎng)頁和你在pc加載的網(wǎng)頁地址不一樣距误,當(dāng)你用手機(jī)加載的時候,會自動重定向到m.xx.com這樣的站點(m指mobile加載的扁位,網(wǎng)頁加載時一般是www.xx.com)准潭。所以會造成網(wǎng)頁上帶有 Class的標(biāo)簽,在手機(jī)上加載時域仇,Class標(biāo)簽就不見了刑然,造成的后果是明明使用getElementByClassName(“”XXX“”).remove()處理過了,但是沒有起作用暇务。所以要直接打開手機(jī)版查看源碼

第三點 : 頁面閃爍問題
雖然代碼經(jīng)過開啟子線程通過handler來優(yōu)化了網(wǎng)頁加載過程中的標(biāo)題和廣告顯示問題,但是這種去標(biāo)題的方式還有個小不美的地方,因為本質(zhì)是加載兩次Url,一次是原本的Url,一次是處理過的URL ,所以剛開始會閃一次 . (這個問題還沒有解決,歡迎有思路的小伙伴一起探討~~~)
(文章參考地址:http://www.reibang.com/p/d793c8d4ff81)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泼掠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垦细,更是在濱河造成了極大的恐慌择镇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括改,死亡現(xiàn)場離奇詭異沐鼠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叹谁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門饲梭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人焰檩,你說我怎么就攤上這事憔涉。” “怎么了析苫?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵兜叨,是天一觀的道長穿扳。 經(jīng)常有香客問我哎迄,道長戈咳,這世上最難降的妖魔是什么炒事? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任懈叹,我火速辦了婚禮慨默,結(jié)果婚禮上坷随,老公的妹妹穿的比我還像新娘枣申。我一直安慰自己茂契,他們只是感情好屡久,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布忆首。 她就那樣靜靜地躺著,像睡著了一般被环。 火紅的嫁衣襯著肌膚如雪糙及。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天筛欢,我揣著相機(jī)與錄音浸锨,去河邊找鬼。 笑死版姑,一個胖子當(dāng)著我的面吹牛柱搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漠酿,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冯凹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炒嘲?” 一聲冷哼從身側(cè)響起宇姚,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夫凸,沒想到半個月后浑劳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡夭拌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年魔熏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸽扁。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜绽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桶现,到底是詐尸還是另有隱情躲雅,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布骡和,位于F島的核電站相赁,受9級特大地震影響相寇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钮科,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一唤衫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绵脯,春花似錦佳励、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽份帐。三九已至璃吧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間废境,已是汗流浹背畜挨。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留噩凹,地道東北人巴元。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像驮宴,于是被迫代替她去往敵國和親逮刨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案堵泽? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,748評論 1 92
  • python世界里修己,json和dict是天生一對,他們之間的轉(zhuǎn)換是必須要熟練的 1.dumps/loads 輸出如...
    j4fan閱讀 458評論 0 1
  • “橘生淮南則為橘迎罗,生于淮北則為枳” 人挪活睬愤,樹挪死,這是人類生命高傲的僅存 . 家鄉(xiāng)早已經(jīng)沒有了井纹安,壯大了背對的膽...
    周延龍閱讀 214評論 2 3
  • class 和 id 的使用場景? class 重在樣式的復(fù)用尤辱,重普遍性。id重在劃分樣式區(qū)域厢岂,可以作為樣式表中的...
    南山碼農(nóng)閱讀 374評論 0 0