使用evaluateJavaScript从WKWebView获取标题

Tam*_*isk 5 javascript ios swift wkwebview

我有一个非常简单/简单的问题,但对java的经验绝对没有.我有一个WKWebView,我想使用javascript获取页面的标题文本document.getElementById.

我试图获取标题的网页有以下代码:

<html>
<body>
<div class="toolbar">
<h1 id="pageTitle">Schedules</h1>
</div>
</body>
<html>
Run Code Online (Sandbox Code Playgroud)

这段代码被删节,所以我为任何错误道歉.

然后我试图访问Swift中的pageTitle:

func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {

    webView.evaluateJavaScript("document.getElementById('pageTitle').value") { (result, error) -> Void in
        if error != nil {
            print(result)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是返回零.经过几个小时的搜索,我仍然不知道如何让它工作.任何帮助表示赞赏.

小智 23

您不应该使用javascript来检索页面标题.WKWebView有一个title属性可以为您检索

https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/#//apple_ref/occ/instp/WKWebView/title

title页面标题.(只读)

迅速 var title: String? { get }

WKWebView类是此属性的键值观察(KVO)兼容.

适用于iOS 8.0及更高版本.


sup*_*org 6

正如@SilkyPantsDan 所提到的,如果您只是对 . 感兴趣title,则无需使用 JS。首先你开始观察:

override func viewDidLoad() {
    super.viewDidLoad()
    webView.addObserver(self, forKeyPath: #keyPath(WKWebView.title), options: .new, context: nil)
}
Run Code Online (Sandbox Code Playgroud)

并在title更新时处理您的逻辑:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "title" {
        title = webView.title
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,如果您支持 iOS 8.0,您应该停止观察,因为在 iOS 9.0 之前观察者不会自动删除:

deinit {
    webView.removeObserver(self, forKeyPath: "title")
    //webView.removeObserver(self, forKeyPath: "estimatedProgress")
}
Run Code Online (Sandbox Code Playgroud)