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

Posted

技术标签:

【中文标题】WKWebView 在不重新加载页面的情况下评估 Javascript【英文标题】:WKWebView Evaluate Javascript without reloading page 【发布时间】:2014-07-22 00:19:31 【问题描述】:

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

WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[self.webView.configuration.userContentController addUserScript:script];
[self.webView reload];

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

我正在尝试获得与

相同效果的东西
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.querySelector('meta[name=viewport]').setAttribute('content', 'width=%d;', false); ", width]];

【问题讨论】:

【参考方案1】:
[webView evaluateJavaScript:javascriptString completionHandler:nil];

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

【讨论】:

【参考方案2】:

你只能在初始化时通过初始化设置WKWebViewConfiguration

[[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];

对属性configuration 的所有调用都会在运行时的后期复制(请参阅文档和头文件)。所以基本上你对前三行代码所做的是将WKUserScript 设置为从未使用过的WKWebViewConfiguration - 因此无法正常工作。

正确的做法:

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];

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

P.S.:我在我的小项目STKWebKitViewController on GitHub 中使用此代码。也许这也可以节省您的时间!

【讨论】:

如果需要连续调用网页怎么办?你会每次都调用 addUserScript 吗? 请定义“连续”。这种方法在每次页面加载时运行相同的 JavaScript。如果您想更改正在执行的脚本,evaluateJavaScript: 可能是您更好的解决方案。 假设您需要调用该函数并将当前时间戳作为参数传递给每个 uibutton 点击​​。您会怎么做? 绝对是evaluateJavaScript:!正如您在上面的代码中看到的那样,使用 WKUserScripts 只能在文档开始或结束时执行,而不是针对按钮单击等自定义事件。

以上是关于WKWebView 在不重新加载页面的情况下评估 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载整个页面的情况下重新加载 div?

如何在不刷新整个页面的情况下重新加载组件?

如何在不重新加载页面的情况下提交表单[重复]

如何在不刷新页面的情况下在 ReactJS 中重新加载?

如何在不重新加载页面的情况下更改 URL?

如何在不重新加载整个页面的情况下刷新 div?