javascript - iOS WebKit - 判断一个WebView是否已经完全加载了JS内容
问题描述
我正在尝试从第三方 URL 中解析出一些 HTML 元数据;但是,直到在WKWebView
.
因此,我一直在尝试检测何时WKWebView
使用 Javascript 完全加载了网页,但不幸的是我无法做到。
这是我尝试过的:
- 我尝试使用
WKUserContentController
并处理了协议方法,但这不起作用,因为协议方法仅在收到脚本消息时才执行,而不是在完成时执行。 WKWebView
我尝试为's添加一个观察者,estimatedProgress
但estimatedProgress
在 JS 脚本完成加载之前返回 1.0。- 我尝试使用
WKNavigationDelegate
协议方法webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
,但它本质上与添加观察者相同。 - 我还尝试在方法中使用
WKWebView
'方法来检查两者:evaluateJavaScript
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)
处理观察者
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
它是真的。
解决方案
To check if your WKWebView has loaded:
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.
}
}
But it is per each resource, not for the whole page with all the resources. Take a look at https://stackoverflow.com/a/43172313/3857830
推荐阅读
- jquery - 在另一个克隆中克隆。子克隆仅在父克隆中有效,在父克隆中无效
- android - 为什么按下硬件后退按钮后,我的活动进度条没有显示在我的片段中?
- github - github存储库名称中特殊字符的规则?
- excel - 如何实现从excel到vbnet的LOOKUP功能?
- c++ - 在 Visual Studio 2013 上使用 StingRay Grid 时出错
- javascript - Javascript 中的表单验证脚本
- php - Tinymce wiris 插件图像模式问题
- sql - SQL 表中的公共记录
- c++ - 缺少类型说明符 - 假定为 int。注意 c++ 不支持 default-int
- python - 自定义 Alexa 技能 ExampleSkillIntentHandler 被正确触发,但得到“抱歉,我在执行您要求的操作时遇到问题。请重试。”