【问题标题】:Detect when link is clicked WebView (Mac)检测何时单击链接 WebView (Mac)
【发布时间】:2012-11-27 08:08:45
【问题描述】:

我正在尝试检测何时单击 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]);

}

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

【问题讨论】:

    标签: macos webview delegates


    【解决方案1】:

    要实现策略侦听器,您需要这样做:

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

    【讨论】:

    • 所以我应该添加 thr 方法?
    • 谢谢。在我的情况下,我检测到可下载的Blob HTML5 对象链接(即类似blob:https://mydomain/BLOB_ID),我可以这样做,但我不知道如何让这个文件被下载而不是可视化(即现在发生了什么)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2010-12-06
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2018-03-06
    • 2012-12-18
    相关资源
    最近更新 更多