使用 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