[英]How do I repurpose JSContext in UIWebView to WKScriptMessage for WKWebview
我想将 UIWebView 库转换为使用 WkWebview。 剩下的部分是切换 JSContext 因为valueForKeyPath
不再起作用了。 那么我该如何重写类似下面的内容以使用 WKScriptMessage 作为其他 SO 链接所建议的? (swift 或 ObjC 答案很好) 如何从 WKWebView 获取 JSContext
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"contentPasteCallback"] = ^(JSValue *msg) {
__weak typeof(weakSelf) StrongSelf = weakSelf;
StrongSelf.editorPaste = YES;
};
[ctx evaluateScript:@"document.getElementById('zss_editor_content').addEventListener('paste', contentPasteCallback, false);"];
我已将WKWebView
转换为UIWebView
以供编辑器使用。 我已经从这个Github Link创建了叉子。 我的演示链接可以在这里找到。
好的,我想通了。 请参阅 PR https://github.com/nnhubbard/ZSSRichTextEditor/pull/243
基本上你注入 javascript 来启动监听器。 这里的关键是传递 function ,它使用postMessage
调用 webkit 并使用相同的名称,在我的例子中是'jsm'
,就像你创建WKUserContentController
object 时设置的那样
NSString *pasteListener = @"document.getElementById('zss_editor_content').addEventListener('paste', function() {window.webkit.messageHandlers.jsm.postMessage('paste');});";
[self.editorView evaluateJavaScript:pasteListener completionHandler:^(NSString *result, NSError *error) {
if (error != NULL) {
NSLog(@"%@", error);
}
}];
然后你在userContentController: didReceiveScript
来自WKScriptMessageHandler
的 didReceiveScript 委托方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSString *messageString = (NSString *)message.body;
if ([messageString isEqualToString:@"paste"]) {
self.editorPaste = YES;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.