javascript - WKWebview 的 javascript 调用返回 nil

标签 javascript ios uiwebview wkwebview wkwebviewconfiguration

我正在尝试从使用 UIWebview 迁移到 WKWebview,我需要调用 webview 中的各种 Javascript 函数。

在 UIWebview 中,我可以毫不费力地执行此操作,但 WKWebview 会为所有调用抛出 WKErrorDomain Error 4。我认为这可能是一个竞争条件,我正在调用 DOM 中尚不存在的函数,但我添加了一个调试语句以在页面加载后进行相同的调用并且它们不工作。我什至做了一个“document.body.innerHTML”,当 web View 中清楚地显示内容时,它返回 nil。

不同之处在于,当通过 Safari Web Inspector 检查 Web 代码时,一切正常,所有调用都正常。

为什么会这样?怎么会这样?我确实使用 WKWebViewConfiguration 初始化了 WKWebView,这样它就可以在不同的 webview 之间共享 cookie,所以那里可能有一些东西,但我很困惑。

这就是我初始化 WKWebView 的方式

WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];
config.processPool = [[WKProcessPool alloc] init];
WKUserContentController* userContentController = WKUserContentController.new; 
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie = 'cookie1=value1; domain=blah; path=/;';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
config.userContentController = userContentController;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0,0,50,50) configuration:config];

这是一个调试语句,我将文档的 innerHTML 记录到控制台日志中,它打印 (nil) 而不是 HTML。

NSLog(@"%@", [self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:nil]);

最佳答案

WKWebView 不同于UIWebView 执行JS async;你不能像现在这样打印..

试试这个

  [self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
    NSLog(@"Error is %@",error);
    NSLog(@"JS result %@" ,result);
}];

关于javascript - WKWebview 的 javascript 调用返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31301698/

相关文章:

ios - 我什么时候应该使用 didFinishLaunchingWithOptions?

IOS Swift UIWebView 如何在不放大视频的情况下显示视频

javascript - 使用 Objective-c 捕获 JavaScript 异步调用

seleniums "clickAt()"方法背后的 JavaScript 代码?

javascript - 添加 JQuery 时出错

javascript - Bootstrap 切换不起作用?

javascript - 是否有可能在 Javascript 或 Python 中在 R 中实现类似 "non standard evaluation"的东西?

ios - 从异步调用返回图像

ios - 无法使用 removeFromParent : Swift 删除点击的 spriteNode

ios - 在 UIWebView 中调用自定义 js 函数