如何在UIWebView上检测DOM加载事件?

时间:2015-02-08 06:33:59

标签: ios objective-c uiwebview

我有一个图像密集的网页,我通过UIWebView加载。 我在webviewdidstartLoad上显示一个微调器并在webviewdidfinishLoad上关闭。

它工作正常,但问题是,webviewdidfinishLoad在页面上的所有图像都已加载之前不会被调用。

有没有办法检测DOM就绪事件,所以我可以在加载所有DOM元素后立即关闭微调器?等待所有图像需要花费太多时间..

2 个答案:

答案 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/