iOS WebKit-确定WebView是否已完全加载JS内容

时间:2018-12-22 22:46:28

标签: javascript ios swift webkit

我正在尝试从第三方URL解析一些HTML元数据;但是,在-中执行某些Javascript脚本之前,我无法获得完整的HTML数据。

因此,我一直在尝试检测WKWebView何时已使用Java脚本完全加载了网页,但是很遗憾,我无法这么做。

这是我尝试过的:

  • 我尝试使用WKWebView并处理了协议方法,但这没有用,因为协议方法仅在收到脚本消息时才执行,而不是在完成时才执行。
  • 我尝试为WKUserContentController的{​​{1}}添加观察者,但WKWebView在加载JS脚本之前返回1.0。
  • 我尝试使用estimatedProgress协议方法estimatedProgress,但这本质上与添加观察者相同。
  • 我还尝试在WKNavigationDelegate方法中使用webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)的{​​{1}}方法来检查这两个方法:
    • WKWebView
    • evaluateJavaScript

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

代码

这是我尝试过但不起作用的最后一种方法的代码:

初始化observeValue

document.readyState == \"interactive\"

处理观察者

document.readyState == \"completed\"

执行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) ,因为它执行得太早了。但是我试图让观察者继续进行,直到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") } } } } } 为真。

1 个答案:

答案 0 :(得分: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. 
  }
}

但这是针对每个资源的,而不是针对所有资源的整个页面。看看https://stackoverflow.com/a/43172313/3857830