使用evaluateJavaScript从WKWebView获取标题

时间:2015-09-24 00:42:13

标签: javascript ios swift wkwebview

我有一个非常简单/容易的问题,但对java的经验绝对没有。我有一个WKWebView,我希望使用javascript 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)
        }
    }
}

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

6 个答案:

答案 0 :(得分:18)

您不需要使用javascript来检索页面标题。 WKWebView有一个title属性,可以为您检索此内容

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

  

title页面标题。 (只读)

     

SWIFT   var title: String? { get }

     

WKWebView类符合此属性的键值观察(KVO)。

     

适用于iOS 8.0及更高版本。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我使用了相同的代码段,并解决了问题...它只会打印结果,如果它&#34; nil&#34;!

尝试:

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

答案 3 :(得分:0)

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

因此,将代码更改为此,一切正常。

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

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

答案 4 :(得分:0)

此代码适用于我:

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

答案 5 :(得分:0)

如@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 == "estimatedProgress" {
        title = webView.title
    }
}

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

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