这几天在写webView的时候,遇到了一个坑。需求是这样的,webView加载HTML的时候,只显示部分需要的内容。
这里测试的是百度的搜索引擎。然而这里有个很重要的区别点。先放连接上来对比下:
2:这个时我们放在Android端webView上的连接:https://www.baidu.com/s?wd=webview
通过以上图1和图2的对比我们可以看到一个明显的区别。就是两个连接的显示会有明显的变化。看到源码,头部的标签的id和class也不一样。这个地方需要特别注意。
不然后面用loadurl加载js隐藏头部的时候时,得到的对象时空的,根本找不到对应的标签。
之前一直在找的问题就是,webView加载的时连接2(图2)的显示。但是找标签一直是按连接1(图1)的id/class去找对应的标签。
找到了问题所在,下面直接上代码:
编写js代码:(通过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) ";
通过调用getClass获取对应的标签:
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代码执行:
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","进入执行");
}
问题2:隐藏代码正确,但隐藏不了。
在隐藏标签时,需要等页面加载完成才能隐藏,因此我们需要在WebViewClient工具类下的方法onPageFinished内执行上面的代码。(这里有个注意点:在这个方法内实现隐藏代码,在页面加载完成之前,我们还是可以看到隐藏部分的。等页面全部加载完成后,js隐藏代码才会执行。)
那么我们要想标签在加载的过程中就隐藏,那怎么做呢!这个时候WebChromeClient工具类提供 了一个方法onProgressChanged,就是页面加载进度的变化。我们可以在这个方法内再一次执行上面的js代码。
下面贴上代码实现截图:
第一次写,对于问题的描述,和解决过程表达的不是很清楚。如果有什么不对的地方,请指正。谢谢