使用 evaluateJavaScript 从 WKWebView 获取标题

Getting title from WKWebView using evaluateJavaScript

我有一个非常 simple/easy 的问题,但对 java 的经验绝对为零。我有一个 WKWebView,我想使用 java 脚本 document.getElementById.

获取页面的标题文本

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

<html>
<body>
<div class="toolbar">
<h1 id="pageTitle">Schedules</h1>
</div>
</body>
<html>

此代码已删节,如有任何错误,我深表歉意。

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

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

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

结果返回 nil。经过几个小时的搜索,我仍然不知道如何让它工作。感谢任何帮助。

您不需要使用 javascript 来检索页面标题。 WKWebView 有一个 title 属性 会为您检索这个

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

title The page title. (read-only)

SWIFT var title: String? { get }

The WKWebView class is key-value observing (KVO) compliant for this property.

Available in iOS 8.0 and later.

使用Node.textContent获取文本节点内容的正确副本。

webView.evaluateJavaScript("document.getElementById('pageTitle').textContent") { (result, error) -> Void in
    if error != nil {
        print(result)
    }
}

我使用了相同的代码片段,并解决了问题...它只会打印 "nil" 的结果!

尝试:

webView.evaluateJavaScript("document.getElementById('pageTitle').textContent") { (result, error) -> Void in
    if error == nil {
        print(result)
    }
}

当你的代码出现错误时,代码会打印出结果。当没有错误发生时,这将不打印任何内容。

所以把你的代码改成这样,一切正常。

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

    webView.evaluateJavaScript("document.getElementById('pageTitle').innerHTML") { (result, error) -> Void in
        if error != nil {
            print(error)
        }
        print(result)
    }
}

这段代码适合我:

webView.evaluateJavaScript("document.title').textContent") { (result, error) -> Void in
    if error == nil {
        print(result)
    }
}

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

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

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

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

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

deinit {
    webView.removeObserver(self, forKeyPath: "title")
    //webView.removeObserver(self, forKeyPath: "estimatedProgress")
}