【问题标题】:How to detect DOM load event on UIWebView?如何检测 UIWebView 上的 DOM 加载事件?
【发布时间】:2015-04-08 02:25:46
【问题描述】:

我正在通过 UIWebView 加载一个包含大量图像的网页。 我在 webviewdidstartLoad 上显示一个微调器并在 webviewdidfinishLoad 上关闭。

它工作正常,但问题是,直到页面上的所有图像都加载完毕后才会调用 webviewdidfinishLoad。

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

【问题讨论】:

  • 尝试使用 NSURLProtocol 或者延迟加载

标签: ios objective-c uiwebview


【解决方案1】:

如果您只需要支持 iOS 8 及更高版本,请查看 WKWebKit 以替换 UIWebView。您可以注入一个在 DOM 上运行的 javascript 准备就绪,然后该脚本可以与您的应用程序通信。有关更多信息,请参阅有关该主题的 NSHipster 页面:http://nshipster.com/wkwebkit/

【讨论】:

    【解决方案2】:

    直接做。但是 - 我知道这并不能具体回答问题 - 首先是使用 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 并在打印出“已加载!”之前检查它是否为真到控制台。

    【讨论】:

    • 您应该注意if l = isLoaded as? Bool where l 仅适用于 Xcode 8.3 beta 和 Swift 1.2 beta。该语法在生产 Xcode 6.1.1 上尚不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多