вложенная строка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
}
Другие вопросы по тегам