WKWebView在不重新加载页面的情况下评估Javascript

JuJ*_*oDi 6 cocoa objective-c wkwebview

目前我只能通过将其添加到webview的配置的userContentController并重新加载页面来弄清楚如何评估javascript:

WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[self.webView.configuration.userContentController addUserScript:script];
[self.webView reload];
Run Code Online (Sandbox Code Playgroud)

如何在我的WKWebView上执行类似于旧WebView的javascript,stringByEvaluatingJavaScriptFromString:这样我就不必重新加载页面了?

我想要获得与之相同效果的东西

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.querySelector('meta[name=viewport]').setAttribute('content', 'width=%d;', false); ", width]];
Run Code Online (Sandbox Code Playgroud)

rvi*_*007 11

[webView evaluateJavaScript:javascriptString completionHandler:nil];
Run Code Online (Sandbox Code Playgroud)

执行与为UIWebView列出的功能相同的功能


stk*_*stk 8

您只能WKWebViewConfiguration通过初始化程序设置初始化时间

[[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
Run Code Online (Sandbox Code Playgroud)

对属性的所有调用configuration都将在运行时的后期复制(请参阅docs和Header文件).所以基本上you're与前三行的代码做的是设置WKUserScriptWKWebViewConfiguration这是从来没有使用过-因此无法正常工作.

正确的方法:

NSString *scriptString = @"Some javascript";
WKUserScript *script = [[WKUserScript alloc] initWithSource:scriptString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[userContentController addUserScript:script];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = userContentController;
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您将evaluateJavaScript:不再需要.

PS:我STKWebKitViewController在GitHub上的小项目中使用了这段代码.也许这也会节省你的时间!