对于可能感兴趣的人:
原来这不是iframe 的问题,这是因为一些<a> 没有直接更改url,它调用了一些javascript 来完成这项工作。这是从调用堆栈中检查的。
在这种情况下,第一件事是需要再连接一个代表,createWebViewWithRequest。默认情况下,此委托返回 nil。所以改成这样:
- (WebView*)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request
{
return sender;
}
不多做,让下面的代码继续。
第二件事是 javascript url 请求转到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
}