我有一个图像密集的网页,我通过UIWebView加载。 我在webviewdidstartLoad上显示一个微调器并在webviewdidfinishLoad上关闭。
它工作正常,但问题是,webviewdidfinishLoad在页面上的所有图像都已加载之前不会被调用。
有没有办法检测DOM就绪事件,所以我可以在加载所有DOM元素后立即关闭微调器?等待所有图像需要花费太多时间..
答案 0 :(得分:1)
直截了当地做。但是 - 并且我知道这不能回答具体问题 - 首先是使用WKWebView
而不是UIWebView
。
然后,在其中一个属性estimatedProgress
上设置KVO:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject: AnyObject], context: UnsafeMutablePointer<Void>) {
if keyPath == "estimatedProgress"
{
if let webView = object as? WKWebView
{
webView.evaluateJavaScript("document.readyState == \"interactive\"", completionHandler:{ (isLoaded:AnyObject!, error:NSError!) -> () in
if let l = isLoaded as? Bool where l
{
println("Loaded!")
}
}
}
}
请看一下有关readyState
的答案:
How to detect if DOMContentLoaded was fired
Javascript - How to detect if document has loaded (IE 7/Firefox 3)
因为我们正在使用Safari,或者更确切地说是WebKit - 与Safari 相同的引擎 - 上面的Swift代码运行JavaScript评估:
document.readyState == "interactive"
这一行;
if let l = isLoaded as? Bool where l
可选地将结果可选项转换为Bool并在打印出“Loaded!”之前检查它是否为true。到控制台。
答案 1 :(得分:0)
如果您只需要支持iOS 8及更高版本,请查看WKWebKit以替换UIWebView。您可以注入在DOM上运行的javascript,然后脚本可以与您的应用程序通信。有关详细信息,请参阅主题的NSHipster页面:http://nshipster.com/wkwebkit/