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
}
我的 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
}