如何仅在 javascript 代码完成后显示 WebView?
how to display a WebView only after a javascript code is done?
我试图通过使用 javascript 强制 WebView 显示 'skip' 图像。 (像这里:)。
问题是图像仅在 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, 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'; } })()");
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();");
但是网络视图不可见。知道为什么吗?
您可以尝试注入 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();
}
}
现在在 activity 中使用 @JavascriptInterface
注释定义 changeVisibility()
,您在其中添加了 javascriptInterface
,如下所示:
@JavascriptInterface
public void changeVisibility() {
runOnUiThread(() -> webview.setVisibility(View.VISIBLE));
}
我试图通过使用 javascript 强制 WebView 显示 'skip' 图像。 (像这里:)。
问题是图像仅在 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, 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'; } })()");
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();");
但是网络视图不可见。知道为什么吗?
您可以尝试注入 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();
}
}
现在在 activity 中使用 @JavascriptInterface
注释定义 changeVisibility()
,您在其中添加了 javascriptInterface
,如下所示:
@JavascriptInterface
public void changeVisibility() {
runOnUiThread(() -> webview.setVisibility(View.VISIBLE));
}