问题描述
我试图通过使用javascript强制WebView“跳过”图像。 (例如此处:https://stackoverflow.com/a/31848599/13174607)。
问题在于,只有在WebView完成加载后,图像才会消失。我只想在javascript完成后才显示WebView。
这是我的代码:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view,String url) {
super.onPageFinished(webView,url);
webView.loadUrl("javascript:(function(){ var imgs=document.getElementsByTagName('img');" + "for(i=0;i<imgs.length;i++) { imgs[i].style.display='none'; } })()");
}
});
}
我尝试使用setVisibility()
方法,如下所示:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view,String url,Bitmap favicon) {
webView.setVisibility(View.INVISIBLE);
}
@Override
public void onPageFinished(WebView view,url);
webView.loadUrl("javascript:(function(){ var imgs=document.getElementsByTagName('img');" + "for(i=0;i<imgs.length;i++) { imgs[i].style.display='none'; } })()");
webView.setVisibility(View.VISIBLE);
}
});
}
但是没有帮助。 谢谢!
- 编辑:
通过使用建议的解决方案和@mustansir注释,我将此代码写在了'onPageFinished'上:
webView.loadUrl("javascript:" + "function taskOne() {" +
"var imgFlag = 0;" + //will sign when the for loop ended
"var imgs = document.getElementsByTagName('img');" +
"if (imgs==0){imgFlag=1;} " +
"for (i = 0; i < imgs.length; i++) {" +
"imgs[i].style.display = 'none';" +
"if (i==imgs.length-1)" +
"{" +
"imgFlag=1;" +
"}"+
"}}" +
"taskOne();" +
"function taskTwo () {" +
"if(imgFlag==1){" +
"window.visibility.changeVisibility(); }" +
"else {" +
"setTimeout(taskTwo(),100);}}" +
"taskTwo();");
,但Web视图不可见。知道为什么吗?
解决方法
您可以尝试注入JavaScript接口,并在到达循环中的最后一张图片时调用该接口方法以更改WebView
的可见性。
类似这样的东西:
webview.addJavascriptInterface(this,"visibility");
并像这样从您的JavaScript调用此接口:
var imgs = document.getElementsByTagName('img');
for (i = 0; i < imgs.length; i++) {
imgs[i].style.display = 'none';
if (i == imgs.length-1) {
visibility.changeVisibility();
}
}
现在在您添加了changeVisibility()
的活动中,用@JavascriptInterface
注释定义javascriptInterface
,
@JavascriptInterface
public void changeVisibility() {
runOnUiThread(() -> webview.setVisibility(View.VISIBLE));
}