如何将JavaScript中的值传递给Swift

时间:2019-03-16 00:01:45

标签: javascript swift

这是我用来尝试将网站html中某个项目的长度快速转换为变量的代码,因此我可以根据类的长度运行一个函数

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作为值

2 个答案:

答案 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)长度的方法,以便您可以进一步进行调试并查看发生的情况。

答案 1 :(得分:0)

看起来像getElementsByClassName返回一个数组,因此,如果找不到具有该类名称的元素,则该数组的length将为零。它没有获得元素本身的length