вложенная строкаByEvaluatingJavaScript в UIWebview перейти на WKWebview
В реализации UIWebview у меня было что-то вроде:-
if let pageBody = webView?.stringByEvaluatingJavaScript(from: "document.body.innerHTML") {
if pageBody.contains("xyz") {
return webView?.stringByEvaluatingJavaScript(from:
"document.getElementById('xyz').innerHTML")
}
}
Я пытаюсь перенести это на WKWebview:-
Я сделал что-то вроде этого, но возвращаемое значение теряется во вложенных обработчиках завершения:-
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
1 ответ
Решение
evaluateJavaScript
выполняется асинхронно (в отличие от stringByEvaluatingJavaScript
который будет ждать, пока javascript не будет оценен и вернет результат), поэтому resultString
не было установлено к моменту возврата. Вам нужно будет организовать свой код так, чтобы результат 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
}