在evaluateJavaScript之后等待JS回调

时间:2017-01-30 13:06:45

标签: ios swift wkwebview

我正在尝试等待javascript回调,但是,在javascript回调之前调用了swift回调。我怎么能等待JS回调?

AppWebView.evaluateJavaScript("$('.loading-gif').removeClass('hide', function() { return true } );") { (Any, Error) in
\\ .loading-gif successfully hided.
}

3 个答案:

答案 0 :(得分:2)

您可以使用此库https://github.com/marcuswestin/WebViewJavascriptBridge

在JS方面:

bridge.registerHandler("show_loading", function(data, responseCallback) {
    $('.loading-gif').removeClass('hide', function() { 
     responseCallback(true) 
    } );
})

在Swift方面:

self.bridge.callHandler("show_loading",data:nil, handler: { (data:AnyObject!) in
            //do whatever you want...
        })

答案 1 :(得分:2)

您可以通过javascript回调的回调通知本机iOS代码。如果您在javascript中添加以下内容:

window.webkit.messageHandlers.observe.postMessage(JSON.stringify( { callback: 'show_loading' } ));

然后在本机端为您的WKWebView设置WKUserContentController(安装在WKWebViewConfiguration上)。您的userContentController.didReceiveScriptMessage处理程序将使用从Javascript端发送的JSON进行调用。

答案 2 :(得分:2)

使用evaluateJavaScript无法执行此操作,因为只要评估的Javascript返回,就会调用它的回调。这很可能是在异步调用完成之前。

您需要在swift代码中注册一个类似于...的消息处理程序

let script = WKUserScript(source: javascriptString, 
                          injectionTime: injectionTime, 
                          forMainFrameOnly: true)
userContentController.addUserScript(script)
webView.configuration.userContentController.addScriptMessageHandler(self, 
                                            name: "didShowLoading")

然后,您可以在Swift代码中定义委托方法...

func userContentController(userContentController: WKUserContentController,
    didReceiveScriptMessage message: WKScriptMessage) {

    if message.name == "didShowLoading" {
        // do something
    }
}

最后,您可以发布javascript代码中的消息......

var script = "$('.loading-gif').removeClass('hide', function() {"
           + "  webkit.messageHandlers['didShowLoading'].postMessage('');"
           + "});"
webView.evaluateJavaScript(script)