WKWebView在触发本机代码之前等待DOM呈现

时间:2015-05-01 10:45:38

标签: javascript ios objective-c hybrid-mobile-app wkwebview

我有一个包含WKWebView的混合iOS应用,我有一个JavaScript函数callNative可以在主线程中调用Objective C本机代码。

在我的JavaScript中,我有以下结构

modifyDOM(); // e.g. .show(), and .hide() stuff
callNative('animateWKWebViewFrame');

出于某种原因,在{/ em> animateWKWebViewFrame完成并完全呈现之前,modifyDOM(本机代码)被称为。 (这会引起视觉故障。)

如何在调用本机代码之前强制完全呈现DOM修改?

2 个答案:

答案 0 :(得分:1)

我假设你使用的是jQuery,因为你的评论说modifyDOM来电show()hide()。如果是这种情况,那么您应该依赖complete参数来提供一个函数,该函数将依次调用您的本机代码。

相关文件如下:
http://api.jquery.com/hide/#hide-duration-complete
http://api.jquery.com/show/#show-duration-complete

最后,这里有一些示例代码:

function modifyDOM()
{
  someElement.show(400, function() {callNative('animateWKWebViewFrame');});
}

答案 1 :(得分:0)

如何使用另一个回调来检测modifyDOM()函数?

// alloc webview
    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    [theConfiguration.userContentController addScriptMessageHandler:self name:@"interOp"];
    self.webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:theConfiguration];

完成modifyDOM()函数后,调用" interOp"回调然后你可以用任何想要的方式回调initiate()并调用animateWKWebViewFrame

- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {

    NSDictionary *sentData = (NSDictionary*)message.body;
    NSString* command = sentData[@"command"];

    LOG(@"[userContentController] command(%@)", command);

    if ( [command isEqualToString:@"DOMReady"] ) {
        // defining a JavaScript function
        NSString *jsFunctionText = @"Initiate({"
                                    "command:animateWKWebViewFrame"
                                    "});";
        [self.webView evaluateJavaScript:jsFunctionText completionHandler:^(id object, NSError * err) {
            if ( err ) {
                LOG(@"[evaluateJavaScript] error(%@)", err);
            }
        }];
    }