使用 evaluateJavaScript 从 WKWebView 获取标题

Posted

技术标签:

【中文标题】使用 evaluateJavaScript 从 WKWebView 获取标题【英文标题】:Getting title from WKWebView using evaluateJavaScript 【发布时间】:2015-09-24 00:42:13 【问题描述】:

我有一个非常简单/容易的问题,但对 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)
        
    

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

【问题讨论】:

【参考方案1】:

您不需要使用 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 及更高版本。

【讨论】:

哦,我明白了。很高兴知道,但我还想检索网页上的其他一些元素。我想大致了解该过程,以便将来获得其他详细信息。 你有后续q吗,因为这个答案没有回答我的问题,和你的一样,但不是标题。【参考方案2】:

正如@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")

【讨论】:

上面第二段代码有错别字。第二行应该是if keyPath == "title" 【参考方案3】:

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

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

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】:

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

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

【讨论】:

【参考方案5】:

我使用了相同的代码 sn-p,并解决了问题......它只会打印结果如果它是“nil”!

试试:

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

【讨论】:

这如何帮助 OP 解决当前问题? 因为代码很有可能有效,但 OP 永远看不到结果!唯一的输出将是“nil”【参考方案6】:

这段代码对我有用:

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

【讨论】:

以上是关于使用 evaluateJavaScript 从 WKWebView 获取标题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用evaluateJavaScript 将数据从WKWebview 发送到HTML 文件| iOS | Objective-C

使用 evaluateJavascript 处理来自 Android WebView 的 Promise

WKWebView evaluateJavaScript 不返回 html

WKWebview evaluateJavascript 不工作,抛出错误

evaluateJavascript 是如何工作的?

使用 EvaluateJavaScript 单击按钮的意外行为