gpt4 book ai didi

macos - 如何修改或覆盖 Mac 上 WKWebView 中的上下文菜单?

转载 作者:行者123 更新时间:2023-12-03 01:36:50 27 4
gpt4 key购买 nike

我在 Mac OS X 应用程序中使用 WKWebView。我想覆盖当用户 Control + 单击或右键单击 WKWebView 时出现的上下文菜单,但我找不到实现此目的的方法。

需要注意的是,上下文菜单的变化取决于 WKWebView 的状态以及调用上下文菜单时鼠标位于鼠标下方的元素。例如,当鼠标悬停在内容的“空”部分上时,上下文菜单仅具有单个“重新加载”项,而右键单击链接会显示“打开链接”、“在新窗口中打开链接”等选项很快。如果可能的话,对这些不同的菜单进行精细控制将会很有帮助。

较旧的 WebUIDelegate 提供 - webView:contextMenuItemsForElement:defaultMenuItems:
方法,允许您自定义 WebView 实例的上下文菜单;我本质上是在寻找与 WKWebView 方法类似的方法,或者任何复制该功能的方法。

最佳答案

您可以通过拦截 JavaScript 中的 contextmenu 事件,通过 scriptMessageHandler 将事件报告回 OSX 容器,然后从 OSX 弹出菜单来实现此目的。您可以通过脚本消息的正文字段传回上下文以显示适当的菜单,或为每个菜单使用不同的处理程序。

在 Objective C 中设置回调处理程序:

WKUserContentController *contentController = [[WKUserContentController alloc]init];
[contentController addScriptMessageHandler:self name:@"callbackHandler"];
config.userContentController = contentController;
self.mainWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:config];

使用jquery的Javascript代码:

$(nodeId).on("contextmenu", function (evt) {
window.webkit.messageHandlers.callbackHandler.postMessage({body: "..."});
evt.preventDefault();
});

从 Objective C 响应它:

-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
if ([message.name isEqualToString:@"callbackHandler"]) {
[self popupMenu:message.body];
}
}

-(void)popupMenu:(NSString *)context {
NSMenu *theMenu = [[NSMenu alloc] initWithTitle:@"Context Menu"];
[theMenu insertItemWithTitle:@"Beep" action:@selector(beep:) keyEquivalent:@"" atIndex:0];
[theMenu insertItemWithTitle:@"Honk" action:@selector(honk:) keyEquivalent:@"" atIndex:1];
[theMenu popUpMenuPositioningItem:theMenu.itemArray[0] atLocation:NSPointFromCGPoint(CGPointMake(0,0)) inView:self.view];
}

-(void)beep:(id)val {
NSLog(@"got beep %@", val);
}

-(void)honk:(id)val {
NSLog(@"got honk %@", val);
}

关于macos - 如何修改或覆盖 Mac 上 WKWebView 中的上下文菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28801032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com