swiftui中的validateJavaScript [英] evaluateJavaScript in swiftui
问题描述
从Webview收到消息后如何使评估JavaScript正常工作?
How to get evaluateJavaScript to work when a message is received from webview?
print(message.body)< ---工作正常
print(message.body) <--- this is working
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0] .style.backgroundColor ='red',completionHandler:nil)< ---这不是
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'", completionHandler: nil) <--- this is not
struct WebView: UIViewRepresentable {
let request: URLRequest
let contentController = ContentController(nil)
func makeUIView(context: Context) -> WKWebView {
let webConfiguration = WKWebViewConfiguration()
let wkcontentController = WKUserContentController()
wkcontentController.add(contentController, name: "test")
webConfiguration.userContentController = wkcontentController
return WKWebView(frame: .zero, configuration: webConfiguration)
}
func updateUIView(_ view: WKWebView, context: Context) {
view.load(request)
}
class ContentController: NSObject, WKScriptMessageHandler {
var parent: WKWebView?
init(_ parent: WKWebView?) {
self.parent = parent
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "test"{
print(message.body)
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'", completionHandler: nil)
}
}
}
推荐答案
这里是可行的方法.由于我没有预期的测试环境,因此无法完全测试它,但是所有基础结构都正确构建.所以你可以尝试
Here is possible approach. As I don't have intended testing environment I could not test it completely, but all infrastructure constructed correctly. So you can try
struct WebView: UIViewRepresentable {
let request: URLRequest
func makeUIView(context: Context) -> WKWebView {
let webConfiguration = WKWebViewConfiguration()
let wkcontentController = WKUserContentController()
wkcontentController.add(context.coordinator, name: "test")
webConfiguration.userContentController = wkcontentController
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
context.coordinator.parent = webView // inject as weak
return webView
}
func updateUIView(_ view: WKWebView, context: Context) {
if view.url == nil {
view.load(request)
}
}
func makeCoordinator() -> ContentController {
ContentController() // let handler be a coordinator
}
class ContentController: NSObject, WKScriptMessageHandler {
weak var parent: WKWebView? // weak to avoid reference cycling
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
if message.name == "test" {
print(message.body)
parent?.evaluateJavaScript("document.getElementsByClassName('mat-toolbar-single-row')[0].style.backgroundColor = 'red'",
completionHandler: nil)
}
}
}
}
这篇关于swiftui中的validateJavaScript的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!