我想删除android'WebView
'中网站的标题。有了我的代码,它就有效。但问题是'WebView
'在完全加载页面后删除了标题。我想删除它,而它正在加载。
这是代码片段:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url)
{
webView.loadUrl("javascript:(function() { " +
"var head = document.getElementsByTagName('header')[0];"
+ "head.parentNode.removeChild(head);" +
"})()");
webView.loadUrl("javascript:(function() { " +
"var head = document.getElementsByTagName('footer')[0];"
+ "head.parentNode.removeChild(head);" +
"})()");
}
});
答案 0 :(得分:4)
ANDROID WebView - 从Android网页中删除标题或任何标记
让我们了解它是如何可能的,在我的情况下,我在webview中加载了url,看起来像下面的屏幕截图,
现在从上面的视图中我们是否要删除标题和菜单 网页的一部分。我们需要在帮助下使用 JSOUP lib 你可以删除不必要的网页部分。
<强> STEPS 强>
在app level build gradle中添加jsoup lib
编译'org.jsoup:jsoup:1.10.3'
现在在活动中我们将使用Async任务,因为我们解析/删除一些导致网络操作的html标记,这些标记无法直接在UI Thread上完成。 Async Task允许您在UI线程上执行后台操作并发布结果。它有三种常用的方法。
onPreExecute(): - 用于显示进度条
doInBackground(): - 此步骤用于执行可能需要很长时间的后台计算。您无法更新此方法中的任何UI。
onPostExecute(): - 在完成后台任务后调用它,它将更新UI。
我已经在xml中定义了WebView,如下所示:
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webview"/>
在MainActivity.java中,我编写了JSOUP代码,用于删除不必要的网页部分
public class MainActivity extends AppCompatActivity {
WebView webview;
String url="http://pixelay.com/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webview= (WebView) findViewById(R.id.webview);
new MyAsynTask().execute();
}
private class MyAsynTask extends AsyncTask<Void, Void, Document> {
@Override
protected Document doInBackground(Void... voids) {
Document document = null;
try {
document= Jsoup.connect(url).get();
document.getElementsByClass("main-navigation").remove();
document.getElementsByClass("custom-header-image").remove();
} catch (IOException e) {
e.printStackTrace();
}
return document;
}
@Override
protected void onPostExecute(Document document) {
super.onPostExecute(document);
webview.loadDataWithBaseURL(url,document.toString(),"text/html","utf-8","");
webview.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, request);
}
});
}
}
}
现在,是时候看结果了,
答案 1 :(得分:4)
最简单的方法是在onLoadResource()
方法中注入Javascript。把它放在try-catch块中,因为WebView
在加载之前不知道该元素:
webView.setWebChromeClient(new WebChromeClient() {
...
@Override
public void onLoadResource(WebView view, String url) {
try {
webView.loadUrl("javascript:(window.onload = function() { " +
"(elem1 = document.getElementById('id1')); elem.parentNode.removeChild(elem1); " +
"(elem2 = document.getElementById('id2')); elem2.parentNode.removeChild(elem2); " +
"})()");
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:1)
使用onPageStarted
方法代替onPageFinished
。
来自Android文档here
编辑:阅读其他答案的评论,我看到您希望标题再次显示。只需实现onPageStarted
和onPageEnded
,将标题隐藏在一个标题中并在另一个标题中再次显示。
答案 3 :(得分:1)
public class YourwebView extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl());
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript:var footer = document.getElementById(\"footer\"); footer.parentNode.removeChild(footer); var header = document.getElementById(\"header-full\"); header.parentNode.removeChild(header);");
}
}
并确保您已启用javscript
YourwebView myWebClient = new YourwebView();
webview.setWebViewClient(myWebClient);
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);