如何将 UIWebView 中的 JSContext 重新用于 WKWebview 的 WKScriptMessage

How do I repurpose JSContext in UIWebView to WKScriptMessage for WKWebview

我想将 UIWebView 库转换为使用 WkWebview。剩下的部分是关闭 JSContext,因为 valueForKeyPath 不再起作用。那么我该如何重写类似下面的内容来使用 WKScriptMessage 作为另一个 SO link 建议的呢? (swift 或 ObjC 答案很好)How to get JSContext from WKWebView

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

我已将编辑器的 UIWebView 转换为 WKWebView。我已经从这个 Github Link. The link to my demo can be found here.

创建了一个分支

好的,我明白了。查看公关 https://github.com/nnhubbard/ZSSRichTextEditor/pull/243

基本上你注入 javascript 来启动监听器。这里的关键是传递使用 postMessage 调用 webkit 的函数并使用相同的名称,在我的例子中 'jsm' 与创建 WKUserContentController 对象时设置的名称相同

    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

的响应
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {

    NSString *messageString = (NSString *)message.body;
    if ([messageString isEqualToString:@"paste"]) {
        self.editorPaste = YES;
    }