macos - 检测何时单击链接 WebView (Mac)

标签 macos webview delegates

我试图检测何时单击 WebView 中的链接。
我设置了代表

[_WebCont delete:self];
_WebCont.policyDelegate = self;


WebPolicyDecisionListener

我用它作为我的听众:
- (void)_WebCont:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener {
    NSString *url = request.URL.absoluteString;
    url = [NSString stringWithFormat:@"*load %@",url];
    [self sendMessage:url];
    NSLog([NSString stringWithFormat:@"Click: %@",url]);

}

但是当我点击 View 中的链接时,它永远不会记录任何内容。
有什么帮助解决这个问题吗?

最佳答案

要实现策略监听器,您需要执行以下操作:

WebPolicyDecisionListener.h:

// ...
@interface WebPolicyDecisionListener: NSObject {
// ...
}


// Implement PolicyDelegate
-(void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation
                                                          request:(NSURLRequest *)request
                                                            frame:(WebFrame *)frame
                                                 decisionListener:(id<WebPolicyDecisionListener>)listener;

-(void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
                                                         request:(NSURLRequest *)request
                                                    newFrameName:(NSString *)frameName
                                                decisionListener:(id <WebPolicyDecisionListener>)listener;
// ...
@end

WebPolicyDecisionListener.m
@implementation WebPolicyDecisionListener
// ...
- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation
                                                           request:(NSURLRequest *)request
                                                             frame:(WebFrame *)frame
                                                  decisionListener:(id<WebPolicyDecisionListener>)listener
{
  if (WebNavigationTypeLinkClicked == [[actionInformation objectForKey:WebActionNavigationTypeKey] intValue])
  {
    // link was clicked do something with it...
  }
  [listener use]; // Say for webview to do it work...
}


-(void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation
                                                         request:(NSURLRequest *)request
                                                    newFrameName:(NSString *)frameName
                                                decisionListener:(id <WebPolicyDecisionListener>)listener
{
  if (WebNavigationTypeLinkClicked == [[actionInformation objectForKey:WebActionNavigationTypeKey] intValue])
  {
    // link was clicked and webview want to open it in new window do something with it...
  }
  [listener ignore]; // ignore webview default implementation...
}
// ...
@end

在你的代码中的某个地方是这样的:
WebPolicyDecisionListener* listener = [[WebPolicyDecisionListener alloc] init];
// ...
[_WebCont setPolicyDelegate:listener];

关于macos - 检测何时单击链接 WebView (Mac),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792023/

相关文章:

c# - 类内委托(delegate)的默认值

c - 来自 C 程序的 Bash 内部命令(Ubuntu v/s MacOS)

macos - 在 Mac OS mountain lion 上设置 Subversion Server(可以通过浏览器访问,但无法从 subversion 结帐)

webview - 如何在 vscode webview 中使用 iframe

android - 如何使用 Android Kotlin 在 WebView 中加载 URL?

c# - 转换到 Func 与新 Func?

macos - 如何调用插件主类以外的类的方法

macos - 在 OS X 上从单声道打印

android - WebView:加载 url 时请求错误

ios - 当我在 UITextField 中按返回键时如何隐藏键盘?