iframe 中的链接未触发 decidePolicyForNewWindowAction

Links in iframe are not triggering decidePolicyForNewWindowAction

我的 webview macos 应用程序中有一个 youtube 播放器的 iframe,iframe 中的大多数 links(<a> 元素)没有触发 decidePolicyForNewWindowAction 委托.

唯一有效的 <a> 元素是频道 link,其他的如视频标题、youtube 图标都是无声的,我无法区分这些 <a> s.

那为什么有些link不能触发decidePolicyForNewWindowAction

代表的文件:https://developer.apple.com/documentation/webkit/webpolicydelegate/1536381-webview?language=objc

iframe youtube 播放器的文档:https://developers.google.com/youtube/iframe_api_reference

对于可能感兴趣的人:

原来这不是iframe问题,这是因为一些<a>没有直接改变url,它调用了一些javascript 来完成它的工作。这是从调用堆栈中检查的。

在这种情况下,第一件事 是需要连接另一个代表,createWebViewWithRequest。默认情况下,此委托 returns nil。所以像这样改变它:

- (WebView*)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
    return sender;
}

不做太多,让下面的代码继续。

第二件事javascripturl请求改为decidePolicyForNavigationAction .所以仍然没有解雇decidePolicyForNewWindowAction但至少有机会知道它。

在我的例子中,我在 decidePolicyForNavigationAction 中添加了一些条件来区分我的请求和 iframe 的请求,如下所示:

- (void) webView: (WebView*) sender decidePolicyForNavigationAction: (NSDictionary*) actionInformation
                                                            request: (NSURLRequest*) request
                                                              frame: (WebFrame*) frame
                                                   decisionListener: (id <WebPolicyDecisionListener>) listener
{
    NSString* mainDocumentURL = [[request mainDocumentURL] absoluteString];
    NSString* fromYT = @"https://www.youtube.com";
    if ([mainDocumentURL hasPrefix:fromYT]) {
        [[NSWorkspace sharedWorkspace] openURL:url]; // fires Safari
        [listener ignore];
        return;
    }

    // normal flow here, you could open it inside the webview or something
}