UIWebview 中嵌套的 stringByEvaluatingJavaScript 迁移到 WKWebview
nested stringByEvaluatingJavaScript in UIWebview migrate to WKWebview
在 UIWebview 实现中,我有类似的东西:-
if let pageBody = webView?.stringByEvaluatingJavaScript(from: "document.body.innerHTML") {
if pageBody.contains("xyz") {
return webView?.stringByEvaluatingJavaScript(from:
"document.getElementById('xyz').innerHTML")
}
}
我正在尝试将其迁移到 WKWebview:-
我做了类似的事情,但是 return 值在嵌套的完成处理程序中丢失了:-
wkWebView?.evaluateJavaScript("document.body.innerHTML", completionHandler: { (pageBody, nil) in
if let pBody = (pageBody as? String)?.contains("xyz"), pBody {
wkWebView?.evaluateJavaScript("document.getElementById('xyz').innerHTML", completionHandler: { (result, error) in
resultString = result as? String
})
}
})
return resultString
evaluateJavaScript
是 运行 异步的(不像 stringByEvaluatingJavaScript
会等到 javascript 被评估并且 return 结果),所以 resultString
在您 return 时尚未设置。您需要组织代码,以便在完成处理程序 运行 之后使用 javascript 的结果。像这样:
func getElementXYZ(_ completionHandler: @escaping (String?) -> Void) {
wkWebView?.evaluateJavaScript("document.body.innerHTML") { (pageBody, nil) in
if let pBody = (pageBody as? String)?.contains("xyz"), pBody {
wkWebView?.evaluateJavaScript("document.getElementById('xyz').innerHTML") { (result, error) in
completionHandler(result as? String)
}
}
}
}
并调用函数:
self.getElementXYZ { result in
//Do something with the result here
}
在 UIWebview 实现中,我有类似的东西:-
if let pageBody = webView?.stringByEvaluatingJavaScript(from: "document.body.innerHTML") {
if pageBody.contains("xyz") {
return webView?.stringByEvaluatingJavaScript(from:
"document.getElementById('xyz').innerHTML")
}
}
我正在尝试将其迁移到 WKWebview:-
我做了类似的事情,但是 return 值在嵌套的完成处理程序中丢失了:-
wkWebView?.evaluateJavaScript("document.body.innerHTML", completionHandler: { (pageBody, nil) in
if let pBody = (pageBody as? String)?.contains("xyz"), pBody {
wkWebView?.evaluateJavaScript("document.getElementById('xyz').innerHTML", completionHandler: { (result, error) in
resultString = result as? String
})
}
})
return resultString
evaluateJavaScript
是 运行 异步的(不像 stringByEvaluatingJavaScript
会等到 javascript 被评估并且 return 结果),所以 resultString
在您 return 时尚未设置。您需要组织代码,以便在完成处理程序 运行 之后使用 javascript 的结果。像这样:
func getElementXYZ(_ completionHandler: @escaping (String?) -> Void) {
wkWebView?.evaluateJavaScript("document.body.innerHTML") { (pageBody, nil) in
if let pBody = (pageBody as? String)?.contains("xyz"), pBody {
wkWebView?.evaluateJavaScript("document.getElementById('xyz').innerHTML") { (result, error) in
completionHandler(result as? String)
}
}
}
}
并调用函数:
self.getElementXYZ { result in
//Do something with the result here
}