gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:29 34 4
gpt4 key购买 nike

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

所以我一直在尝试检测 WKWebView 何时已使用 Javascript 完全加载网页,但遗憾的是我无法检测到。

这是我尝试过的:

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

但这也不起作用,因为它是在 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)

处理观察者

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

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

最佳答案

检查您的 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

关于javascript - iOS WebKit - 判断一个WebView是否已经完全加载JS内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899851/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com