在进行app开发时,我们会经常遇到webview加载一个网址的情况,但是仅仅是webview.loadUrl()并不能满足我们的需求,因为一般网页上面都有一个标题,,标题的颜色和我们的app风格可能整体都不太搭,这个时候该怎么办?除了让web端的朋友们专门写一个的情况下,还有另外一个方法,就是利用js或者jquery处理,原理都是一样,这里只讲一下js。
解决步骤就是: 1.查看要加载页面源代码,找到要删除的内容的标签 2.自己定义WebViewClient,重写WebViewClient的方法,在.onPageFinished()中编辑javascript函数将显示标题的部分置空或者删除 3.onPageFinished()中加载显示被JavaScript处理过的网页数据
核心代码】: - import org.jsoup.Jsoup;
- import org.jsoup.nodes.Document;
- import org.jsoup.nodes.Element;
- //webView 相关配置
- public void init(){
- webSettings = webView.getSettings();
- webSettings.setDomStorageEnabled(true); // 加载东方航空,需设置此属性,否则,页面加载为空白页
- //设置WebView属性,能够执行Javascript脚本
- webSettings.setJavaScriptEnabled(true);
- webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
- webSettings.setAllowFileAccess(true);
- webSettings.setUseWideViewPort(true);
- webSettings.setLoadWithOverviewMode(true);
- //清除 webkit cookie,解决webView显示原先界面
- CookieSyncManager.createInstance(this);
- CookieSyncManager.getInstance().startSync();
- CookieManager.getInstance().removeSessionCookie();
- }
- /加载完毕后,显示webView,防页面闪烁
- private void initHandler() {
- mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what){
- case 0:
- webView.setVisibility(View.VISIBLE);
- SysProgress.closeProgress();//关闭加载对话框
- //获取网页源代码
- webView.loadUrl("javascript:window.local_obj.showSource('<head>'+"
- + "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
- break;
- }
- }
- };
- }
- final class InJavaScriptLocalObj {
- //获取网页源代码,分析当前页面是哪一个页
- @JavascriptInterface
- public void showSource(String html) {
- if(loginUrl.contains("m.airchina.com.cn")){ //国航官网
- Document document = Jsoup.parse(html);
- Element nameElement = document.getElementById("uname");
- Element mileElement = document.getElementById("mileage");
- if(nameElement!= null && mileElement!= null){ // 登录成功后的页面
- String name = nameElement.text();
- String mileStr = mileElement.text();
- LogUtil.i("name = "+name);
- LogUtil.i("mile = "+mileStr);
- String mile="";
- if(mileStr.contains(":")){
- mile= mileStr.split(":")[1];
- }
- Toast.makeText(VerifyVipActivity.this, "认证成功", Toast.LENGTH_SHORT).show();
- }
- else{ //登录页面
-
- }
- }
- }
- }
- 【webView相关配置代码】
- WebView webView = (WebView) findViewById(R.id.webview);
- WebSettings webSettings = webView.getSettings();
- webSettings.setJavaScriptEnabled(true);
- webSettings.setUseWideViewPort(true);
- webSettings.setLoadWithOverviewMode(true);
- webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
- loginUrl = "https://m.airchina.com.cn/ac/c/invoke/login@pg";
- webView.loadUrl(loginUrl);
- webView.setWebViewClient(new WebViewClient(){
-
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- webView.setVisibility(View.INVISIBLE);
- SysProgress.showProgress(VerifyVipActivity.this); //显示加载对话框
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- //getElementById() 返回对拥有指定 id 的第一个对象的引用。
- //getElementsByName() 返回带有指定名称的对象集合。
- //getElementsByTagName() 返回带有指定标签名的对象集合。
- //getElementsByClassName 返回指定class的对象的集合。
-
- //编写 javaScript方法,使用的是js脚本语言
- String javascript = "javascript:function hideOther() {" +
- "document.getElementsByTagName('body')[0].innerHTML;" +
- "document.getElementsByTagName('header')[0].style.display='none';" + //取标题栏
- /*改变国航登录页面的样式*/
- "if(document.getElementById('regbtn')){" +
- "document.getElementsByTagName('span')[0].style.display='none';" +
- "document.getElementsByTagName('span')[1].style.display='none';" +
- "document.getElementById('regbtn').style.display='none';" +
- "document.getElementById('subbtn').style.backgroundColor='#38761D';" +
- "document.getElementById('subbtn').style.borderColor='#ffffff';" +
- "document.getElementsByClassName('am-padding-left-xs')[0].style.width='100%';" +
- "}else{" +
- /*改变国航登录成功后页面的样式*/
- "document.getElementsByClassName('am-container')[0].style.display='none';" +
- "}" +
- "}";
- //创建方法
- view.loadUrl(javascript);
- //加载方法
- view.loadUrl("javascript:hideOther();");
- mHandler.sendEmptyMessageDelayed(0,500);
- }
- });
复制代码注: 因为本质是webView加载两次Url,一次是原本的Url,一次是处理过的URL ,所以刚进入页面加载的原始页面,过了一段时间是闪烁一下,加载显示的是操作后的Url. 所以,加载开始时webview不可见,显示加载对话框,加载完成后,500ms后,显示webView,关闭对话框。
|