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真相成立。
检查 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/
| 归档时间: |
|
| 查看次数: |
1626 次 |
| 最近记录: |