我正在尝试等待javascript回调,但是,在javascript回调之前调用了swift回调。我怎么能等待JS回调?
AppWebView.evaluateJavaScript("$('.loading-gif').removeClass('hide', function() { return true } );") { (Any, Error) in
\\ .loading-gif successfully hided.
}
答案 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)