1

在 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
4

1 回答 1

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
}
于 2020-07-26T20:27:18.007 回答