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