安卓Webview文档准备就绪的回调函数

4
使用WebView时,有没有一种方法可以检测文档DOM树是否已经加载完成?我知道WebViewClient提供了一个'onPageFinish'回调,但它是在所有Web资源都已经加载完成后才调用的。
如果网页正在运行一个缓慢的请求(可能是一个错误的请求,并且其HTTP状态为“等待响应”),那么直到请求完成,“onPageFinish”才会被调用。我只想捕捉当网页的DOM树加载完成时的事件。
有人能帮忙吗?非常感谢。
3个回答

3
使用 onPageCommitVisible 替换 onPageFinished。
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        prDialog = new ProgressDialog(MainActivity.this);
        prDialog.setMessage("Please wait ...");
        prDialog.show();
    }

    @Override
    public void onPageCommitVisible(WebView view, String url) {
        super.onPageCommitVisible(view, url);
        if(prDialog != null) prDialog.dismiss();
    }

4
为了帮助OP解决当前的问题,请在回答中加入一些解释,说明这个答案如何有助于解决问题。 - ρяσѕρєя K

1
Javascript有一种事件可以用来检测DOM树的构建是否完成,它被称为DOMContentLoaded

JavaScript页面加载事件

你可以使用addJavascriptInterface()注入Javascript,并让它调用在本地端定义了JavaScriptInterface注解的函数,然后使用evaluateJavascript执行DOMContentLoaded
webView.apply {
    settings.javaScriptEnabled = true
    // Inject Javascript
    addJavascriptInterface(
        DomContentLoadedInterface({ /* Do something */ }),
        DomContentLoadedInterface.KEY
    )

    webViewClient = object : WebViewClient() {
        override fun onLoadResource(view: WebView?, url: String?) {
            super.onLoadResource(view, url)
            // Execute Javascript
            evaluateJavascript(DomContentLoadedInterface.SCRIPT)
        }
    }

    loadUrl(URL)
}

其中DomContentLoadedInterface

class DomContentLoadedInterface(private val action: () -> Unit) {

    @JavascriptInterface
    fun execute() {
        action()
    }

    companion object {
        internal const val KEY = "DomContentLoaded"
        internal const val SCRIPT = "javascript:document.addEventListener('DOMContentLoaded',function(){DomContentLoaded.execute()})"
    }
}

注意:在onLoadResourcehttps://dev59.com/ImYq5IYBdhLWcg3w8lJo#58932747)和onPageFinished之后,evaluateJavascript将起作用。

-1

这是我的例子。对于页面:

布尔值isPageLoaded;
webView.setWebViewClient(new WebViewClient() {

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
          isPageLoaded=true;
            return isPageLoaded;
        }
        public void onPageFinished(WebView view, String url) {

       if(!isPageLoaded){}

        }
    });

我的 URL 加载示例已完成。
如果页面未加载完成 {}
如果 URL 有 ok 进程已完成。

1
也许我的问题没有表述清楚。我知道 'onPageFinished' 回调函数,但是这个回调函数是在所有资源请求完成后才被调用的。如果其中一个请求没有返回,那么 'onPageFinished' 就不会被调用。 - 小灰马

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接