webView通過(guò)loadUrl()加載js隱藏部分HTML標(biāo)簽遇到的坑

這幾天在寫(xiě)webView的時(shí)候,遇到了一個(gè)坑。需求是這樣的,webView加載HTML的時(shí)候,只顯示部分需要的內(nèi)容。

這里測(cè)試的是百度的搜索引擎。然而這里有個(gè)很重要的區(qū)別點(diǎn)。先放連接上來(lái)對(duì)比下:

1:這個(gè)是在pc瀏覽器上搜索時(shí)的連接:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=webView&oq=Android%2520webView%2520%25E9%2587%258C%25E9%259D%25A2js%25E9%2580%259A%25E8%25BF%2587id%25E8%258E%25B7%25E5%258F%2596%25E5%2585%2583%25E7%25B4%25A0&rsv_pq=c71bfea90000b04c&rsv_t=dc33lXaNHtYuPiKB9SQ6NqUYEUTowbb%2FVR7U6A3Vc3ZOZebt%2FMMOQ7uoZ58&rqlang=cn&rsv_enter=1&inputT=8290&rsv_sug3=90&rsv_sug1=28&rsv_sug7=101&rsv_sug2=0&rsv_sug4=9040&rsv_sug=2


圖1

2:這個(gè)時(shí)我們放在Android端webView上的連接:https://www.baidu.com/s?wd=webview


圖2

通過(guò)以上圖1和圖2的對(duì)比我們可以看到一個(gè)明顯的區(qū)別。就是兩個(gè)連接的顯示會(huì)有明顯的變化。看到源碼,頭部的標(biāo)簽的id和class也不一樣。這個(gè)地方需要特別注意。

不然后面用loadurl加載js隱藏頭部的時(shí)候時(shí),得到的對(duì)象時(shí)空的,根本找不到對(duì)應(yīng)的標(biāo)簽。

之前一直在找的問(wèn)題就是,webView加載的時(shí)連接2(圖2)的顯示。但是找標(biāo)簽一直是按連接1(圖1)的id/class去找對(duì)應(yīng)的標(biāo)簽。

找到了問(wèn)題所在,下面直接上代碼:

編寫(xiě)js代碼:(通過(guò)class遍歷全局查找div)

javascript:function getClass(parent,sClass) {

?? ??var aEle=parent.getElementsByTagName('div');?

? ??var aResult=[];

?? ??var i=0;?

? ??for(i<0;i<aEle.length;i++) {

?? ??????if(aEle[i].className==sClass) {?

? ??????????aResult.push(aEle[i]);?

? ??????}?

? ??};?

? ??return aResult;?

}void(0) ";

通過(guò)調(diào)用getClass獲取對(duì)應(yīng)的標(biāo)簽:

javascript:function hideOther() {?

getClass(document,'se-head-logo')[0].style.display='none';

getClass(document,'searchboxtop')[0].style.display='none'; getClass(document,'page-banner')[0].style.display='none';}

Android代碼執(zhí)行:

if(url!=null&&url.contains("baidu.com")){

String fun="javascript:function getClass(parent,sClass) { var aEle=parent.getElementsByTagName('div'); var aResult=[]; var i=0; for(i<0;i<aEle.length;i++) { if(aEle[i].className==sClass) { aResult.push(aEle[i]); } }; return aResult; }void(0) ";

? ? view.loadUrl(fun);

? ? String fun2="javascript:function hideOther() { getClass(document,'se-head-logo')[0].style.display='none';getClass(document,'searchboxtop')[0].style.display='none'; getClass(document,'page-banner')[0].style.display='none';}";

? ? view.loadUrl(fun2);

? ? view.loadUrl("javascript:hideOther();");

? ? Log.d("aaa","進(jìn)入執(zhí)行");

}

問(wèn)題2:隱藏代碼正確,但隱藏不了。

在隱藏標(biāo)簽時(shí),需要等頁(yè)面加載完成才能隱藏,因此我們需要在WebViewClient工具類下的方法onPageFinished內(nèi)執(zhí)行上面的代碼。(這里有個(gè)注意點(diǎn):在這個(gè)方法內(nèi)實(shí)現(xiàn)隱藏代碼,在頁(yè)面加載完成之前,我們還是可以看到隱藏部分的。等頁(yè)面全部加載完成后,js隱藏代碼才會(huì)執(zhí)行。)

那么我們要想標(biāo)簽在加載的過(guò)程中就隱藏,那怎么做呢!這個(gè)時(shí)候WebChromeClient工具類提供 了一個(gè)方法onProgressChanged,就是頁(yè)面加載進(jìn)度的變化。我們可以在這個(gè)方法內(nèi)再一次執(zhí)行上面的js代碼。

下面貼上代碼實(shí)現(xiàn)截圖:


onPageFinished方法

onProgressChanged方法

hideHtml方法


第一次寫(xiě),對(duì)于問(wèn)題的描述,和解決過(guò)程表達(dá)的不是很清楚。如果有什么不對(duì)的地方,請(qǐng)指正。謝謝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容