隐藏WebView直到JavaScript完成
我有一个网络视图隐藏WebView直到JavaScript完成,javascript,android,webview,Javascript,Android,Webview,我有一个网络视图 WebView wv; wv = (WebView)findViewById(R.id.webView1); wv.loadUrl("http://example.com/"); 简单地说 地址: 我有: wv.loadUrl("javascript:(function() { " + "document.getElementsByClassName('centered leaderboard_container')[0].style.display = 'none'; "
WebView wv;
wv = (WebView)findViewById(R.id.webView1);
wv.loadUrl("http://example.com/");
简单地说
地址:
我有:
wv.loadUrl("javascript:(function() { " + "document.getElementsByClassName('centered leaderboard_container')[0].style.display = 'none'; " + "document.getElementsByClassName('n')[0].style.display = 'none'; " + "document.getElementsByClassName('paginator')[0].style.display = 'none'; " + "document.getElementsByTagName('ul')[0].style.display = 'none'; " + "document.getElementsByTagName('tr')[0].style.display = 'none'; " + "})()");
我已将webview可见性设置为“不可见”
JavaScript完成后,如何将可见性设置为可见
现在您可以看到整个页面一秒钟,然后JavaScript就完成了
有人吗
另外,该网站不是我的,它是一个第三方网站,在API 17 emulator上经过测试,可以正常工作 您可以将Java中的javascript注入web 反之亦然,加载url后,从javascript调用Java代码上的函数,并执行
setVisibility()
。为此,您将添加一个JS接口
代码如下:
private final static String HOST = "stackoverflow.com";
private WebView wb;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_home);
wb = (WebView) findViewById(R.id.home_webview);
//Make the webview invisible
wb.setVisibility(View.INVISIBLE);
WebSettings webSettings = wb.getSettings();
webSettings.setJavaScriptEnabled(true);
wb.setWebViewClient(new WebViewClient(){
public void onPageFinished(WebView view, String url){
//Inject javascript code to the url given
//Not display the element
wb.loadUrl("javascript:(function(){"+"document.getElementById('Id').style.display ='none';"+"})()");
//Call to a function defined on my myJavaScriptInterface
wb.loadUrl("javascript: window.CallToAnAndroidFunction.setVisible()");
}
});
//Add a JavaScriptInterface, so I can make calls from the web to Java methods
wb.addJavascriptInterface(new myJavaScriptInterface(), "CallToAnAndroidFunction");
wb.loadUrl("http://"+HOST);
}
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(){
runOnUiThread(new Runnable() {
@Override
public void run() {
wb.setVisibility(View.VISIBLE);
}
});
}
}
此功能将针对每个页面执行。一旦进入第三方服务器,您必须管理如何处理每个请求,webClient.shouldOverrideUrlLoading()
可以帮助您
最新答复:
我可以按照您的评论复制它,对于最后一个版本,我们应该做:
从Android4.2开始,您现在必须使用@JavascriptInterface显式注释公共方法,以便从托管JavaScript访问它们。请注意,只有将应用程序的minSdkVersion或targetSdkVersion设置为17或更高版本时,此选项才会生效
我添加了它并导入了android.webkit.JavascriptInterface
我也有同样的问题@GromDroid 也许不是最好的解决方案,但它很有效:
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(){
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
wb.setVisibility(View.VISIBLE);
}
}, 500);
}
});
}
}
在使网络视图可见之前,我已经添加了半秒的延迟。Hmmm,这在我的Galaxy Nexus 4.2.2上不起作用,你知道会出什么问题吗@AlexBcnI仍然会看到“整个”页面一秒钟,然后JavaScript会隐藏这些元素@AlexBcnPut
javascript:(function(){“+”document.getElementById('Id').style.display='none';“+”window.callToAndRoidFunction.setVisible();})(
而不是在两个加载URL上拆分两个脚本。如果webview被设置为不可见,setVisible将是最后一个要执行的命令。太奇怪了,它对我仍然不起作用。。你能给我发一个APK或者项目ZIP,这样我就可以测试你的版本了吗@AlexBcnI下载了,我现在就试试
public class myJavaScriptInterface {
@JavascriptInterface
public void setVisible(){
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
wb.setVisibility(View.VISIBLE);
}
}, 500);
}
});
}
}