【问题标题】:Android webview on document ready callbackAndroid webview 上的文档就绪回调
【发布时间】:2015-12-18 11:48:54
【问题描述】:

在使用 WebView 时,有没有办法检测文档 DOM 树是否已经加载完成?我知道 WebViewClient 提供了一个 'onPageFinish' 回调,但它是在所有 Web 资源加载完成后调用的。

如果网页正在运行一个缓慢的请求(可能是一个错误的请求,并且它的http状态是“等待响应”),那么在请求完成之前不会调用“onPageFinish”。我只想在网页的 DOM 树加载完成时捕获事件。

有人帮忙吗?非常感谢。

【问题讨论】:

    标签: android webview


    【解决方案1】:

    使用 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();
        }
    

    【讨论】:

    • 添加一些解释,说明此答案如何帮助 OP 解决当前问题
    【解决方案2】:

    Javascript 有一个事件,用于检测是否已完成构建 DOM 树,称为 DOMContentLoaded

    JavaScript Page Load Events

    你可以用addJavascriptInterface()注入Javascript,让它在Native端调用JavaScriptInterface注解定义的函数,然后执行DOMContentLoadedevaluateJavascript类似

    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()})"
        }
    }
    

    注意:evaluateJavascript 将在onLoadResource (https://stackoverflow.com/a/58932747/9896693) 和onPageFinished 之后工作

    【讨论】:

      【解决方案3】:

      这是我的例子。对于页面

      布尔 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 加载示例已完成。

      if(!isPageLoaded){}

      如果 url 已经 ok 进程完成。

      【讨论】:

      • 可能是我的问题不清楚。我知道'onPageFinished'回调,但是在所有资源请求完成后调用此回调。如果其中一个请求没有返回,则不会调用'onPageFinished'。
      猜你喜欢
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多