iOS WebKit - 判断WebView是否已完全加载JS内容

Ahm*_*hit 5 javascript webkit ios swift

我正在尝试从第三方 URL 解析出一些 HTML 元数据;然而,直到一些 Javascript 脚本在WKWebView.

所以我一直在尝试检测何时WKWebView用 Javascript 完全加载了网页,但不幸的是我无法做到。

这是我尝试过的:

  • 我尝试使用WKUserContentController并处理协议方法,但这不起作用,因为协议方法仅在收到脚本消息时执行,而不是在完成时执行。
  • WKWebView我尝试为's添加观察者estimatedProgress,但estimatedProgress在 JS 脚本加载完成之前返回 1.0。
  • 我尝试使用WKNavigationDelegate协议方法webView(_ webView: WKWebView, didFinish navigation: WKNavigation!),但它本质上与添加观察者相同。
  • 我还尝试在方法中使用WKWebViewsevaluateJavaScript方法observeValue来检查两者:
    • document.readyState == \"interactive\"
    • document.readyState == \"completed\"

但这也不起作用,因为它是在 JS 加载完成之前执行的。

代码

这是我尝试的最后一种方法的代码,但没有成功:

初始化WKWebView

        let webView = WKWebView(frame: self.view.frame)
        webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)
        webView.load(URLRequest(url: url))
        webView.navigationDelegate = self
        self.view.addSubview(webView)
Run Code Online (Sandbox Code Playgroud)

处理观察者

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "estimatedProgress" {
        if let webView = object as? WKWebView, webView.estimatedProgress > 0.5 {
            print(webView.estimatedProgress)
            webView.evaluateJavaScript("document.readyState == \"interactive\"") { (isLoaded, err) in
                print(isLoaded)
                if let loaded = isLoaded as? Bool, loaded == true {
                    print("completely done loading with JS")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

evaluateJavaScript该方法执行时得到的结果是false因为它执行得太早了。但我试图让观察者继续下去,直到isLoaded真相成立。

Has*_*esh 0

检查 WKWebView 是否已加载:

import WebKit
import UIKit

class ViewController: UIViewController, WKNavigationDelegate {

  let webView = WKWebView()

  override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "https://www.yourwebsite.com/") !
    let request = URLRequest(url: url)
    webView.navigationDelegate = self
    webView.load(request)
  }

func webView(_ webView: WKWebView, didStart navigation: WKNavigation!) {
    print("Strat to load")
}

  func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
     print("loaded")
     //It will print "loaded" in the console everytime the WKWebView has finished loading the page. 
  }
}
Run Code Online (Sandbox Code Playgroud)

但它是针对每个资源的,而不是针对包含所有资源的整个页面。看看/sf/answers/3022061941/