使用 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
属性 会为您检索这个
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")
}
我有一个非常 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
属性 会为您检索这个
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")
}