如何仅在 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));
    }