簡體   English   中英

如何將 UIWebView 中的 JSContext 重新用於 WKWebview 的 WKScriptMessage

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM