Как я могу передать значение из JavaScript в Swift

#javascript #swift

#javascript #swift

Вопрос:

Вот код, который я использую, чтобы попытаться преобразовать длину элемента в HTML-файле веб-сайта в переменную в swift, чтобы я мог запускать функцию в зависимости от длины класса

 self.viewController?.webBrowser?.evaluateJavaScript("document.getElementsByClassName('siteName').length") { (value, error) in
    print("LENGTH IS ", value)
    print("ERROR IS ", error)
    let jsValue = value as? Int

    if jsValue == 0{
        self.waitClick()
    }else{
        self.startItemColor()
    }
}
  

Независимо от того, какова длина, я получу 0 в качестве значения

Ответ №1:

Вероятно, DOM Element еще не был готов, когда вы пытались получить к нему доступ. Вы должны move использовать в своем коде didFinish метод WKNavigationDelegate протокола.

Итак, ваш UIViewController должен выглядеть следующим образом:

 class ViewController: UIViewController, WKNavigationDelegate {

    override func viewDidLoad(){
      super.viewDidLoad()

      ...
      webBrowser.navigationDelegate = self
      webBrowser.load(request)
      ...
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.getElementsByClassName('siteName').length") { (value, error) in
            print("LENGTH IS ", value)
            print("ERROR IS ", error)
            let jsValue = value as? Int

            if jsValue == 0{
                self.waitClick()
            } else {
                self.startItemColor()
            }
        }
    }

}
  

Также не забудьте включить App Transport Security в вашем info.plist вот так

 <key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
  

В случае, если это не сработает, попробуйте отладить, почему. Вероятно, попробуйте вызвать метод в вашем JavaScript, который возвращает длину class="sitename" элемента, а также это console.log(length) , чтобы вы могли продолжить отладку и посмотреть, что происходит.

Ответ №2:

Похоже, что getElementsByClassName возвращает массив, поэтому, если элемент с этим именем класса не найден, то массив будет иметь length значение нуля. Он не получает length самого элемента.