【问题标题】:nested stringByEvaluatingJavaScript in UIWebview migrate to WKWebviewUIWebview 中的嵌套 stringByEvaluatingJavaScript 迁移到 WKWebview
【发布时间】:2020-07-25 17:15:37
【问题描述】:

在 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

【问题讨论】:

    标签: ios swift uiwebview wkwebview evaluatejavascript


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2016-07-12
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 2018-02-20
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多