我正在使用WebKit构建一个非常基本的Cocoa应用程序,以在其中显示Flash/Silverlight应用程序.非常基本,没有意图成为浏览器本身.
到目前为止,我已经能够在一个新的Safari实例中使用它来打开基本的html链接()
[[NSWorkspace sharedWorkspace] openURL:[request URL]];
现在我的困难是window.open()
在JavaScript中使用Safari的新实例中打开一个链接.我"思考"(并且由此,我一直在破解代码并且不确定我是否真的这样做了)我通过设置WebView policyDelegate
并实现它来实现这种工作
-webView:decidePolicyForNavigationAction:request:frame:decisionListener:
委托方法.然而,这导致了一些不稳定的行为.
所以简单的问题是,我需要做什么,以便在window.open()
调用时,在新的Safari实例中打开链接.
谢谢
重点,我通常是.NET开发人员,并且只与Cocoa/WebKit合作了几天.
我昨晚取得了进展,并将我的部分问题归结为一部分.
我已经在使用了webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:
,我已经使用它来使用锚标记,但是当调用JavaScript时,似乎永远不会调用该方法.
但是当window.open()
调用webView:createWebViewWithRequest:request
被调用时,我试图强制窗口在Safari中打开,但请求始终为null.所以我永远无法读出网址.
我已经做了一些搜索,这似乎是一个已知的" 错误 ",但我还没有找到办法解决它.
根据我的理解createWebViewWithRequest
,您可以创建新的webview,然后将请求的URL发送到要加载的新webView. 这是迄今为止我能找到的最佳解释.
因此,虽然很多人都指出了这个问题,但我还没有看到任何符合我需求的解决方案.我将尝试再深入研究decidePolicyForNewWindowAction
一下.
谢谢!
好吧,我正在通过创建一个虚拟webView来处理它,将它的frameLoad委托设置为一个处理的自定义类
- (void)webView:decidePolicyForNavigationAction:actionInformation :request:frame:decisionListener:
并在那里打开一个新窗口.
代码:
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request { //this is a hack because request URL is null here due to a bug in webkit return [newWindowHandler webView]; }
和NewWindowHandler:
@implementation NewWindowHandler -(NewWindowHandler*)initWithWebView:(WebView*)newWebView { webView = newWebView; [webView setUIDelegate:self]; [webView setPolicyDelegate:self]; [webView setResourceLoadDelegate:self]; return self; } - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id)listener { [[NSWorkspace sharedWorkspace] openURL:[actionInformation objectForKey:WebActionOriginalURLKey]]; } -(WebView*)webView { return webView; }