首先明白WebViewClient干啥的?
这货用于辅助WebView,处理各种通知、请求等事件
今天就是要重写她的方法!
这里主要交给javascript完成,那么javascript支持一定不能少!
WebSettings webSetting = webview.getSettings();
webSetting.setJavaScriptEnabled(true);
广告到底是啥?
明白了吧,就是一些div或者其他标签的块~~ 我们要把这些块去除 ~~
那么过滤广告的时机是何时?
页面加载完成的时候
public void onPageFinished(WebView view, String url) {
blockAds(view);//过滤
}
blockAds首要的事情是view.getUrl(),通过url地址去匹配广告标签(Html标签属性)
关键就是构建javascript代码,懂web的都知道,Javascript中提供了访问文档标签的方法
StringBuilder sb = new StringBuilder();
sb.append("javascript: ");
String[] alltag = tags.split(",");
for (int i = 0; i < alltag.length; i++) {
String adTag = alltag[i];
if (adTag.trim().length() > 0) {
adTag = adTag.trim();
if (adTag.contains("#")) {
adTag = adTag.substring(adTag.indexOf("#") + 1);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {//19
sb.append("document.getElementById(\'").append(adTag).append("\').innerHTML=\'\';");
} else {
sb.append("document.getElementById(\'").append(adTag).append("\').remove();");
}
} else if (adTag.contains(".")) {
adTag = adTag.substring(adTag.indexOf(".") + 1);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
sb.append("var esc=document.getElementsByClassName(\'").append(adTag).append("\');for (i in esc){esc[i].innerHTML=\'\';};");
} else {
sb.append("var esc=document.getElementsByClassName(\'").append(adTag).append("\');for (var i = esc.length - 1; i >= 0; i--){esc[i].remove();};");
}
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
sb.append("var esc=document.getElementsByTagName(\'").append(adTag).append("\');for (i in esc){esc[i].innerHTML=\'\';};");
} else {
sb.append("var esc=document.getElementsByTagName(\'").append(adTag).append("\');for (var i = esc.length - 1; i >= 0; i--){esc[i].remove();};");
}
}
}
历史大事件
Android从4.4起提供基于Chromium实现的WebView。此前WebView基于WebKit实现。WebKit提供网页解析、布局和绘制以及JS运行等基础功能。Chromium在WebKit基础上为WebView提供进程、线程和渲染等基础构架。(大概是因为Android部门负责人从Andy Rubin变成了Chrome部门的主管Sundar Pichai了(现任谷歌CEO)吧)。