2009-08-07 48 views
6

我有一个UIWebView,我在我的应用程序中用作嵌入式浏览器。在UIWebView中打开弹出链接,可能吗?

我注意到,打开新窗口的网页中的链接会被忽略,而不会调用我的代码。

我试着设置断点上

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

,然后选择将会打开一个弹出窗口的链接,并且断点从不打。 有什么我可以做的,以截获弹出链接的选择,并获得网址,并正常加载它?

我不想在应用程序本身显示一个弹出窗口,我只是想要在弹出窗口中加载任何内容的URL来加载主Webview本身。

这可能吗?

谢谢!

回答

7

我也遇到过这种情况,而HTML重写是我能想到的最佳解决方案。我采用这种方法遇到的最大问题是,在WebViewDidFinishLoad:方法被调用之前,Web浏览器是交互式的,直到它们被重写为止,所以链接似乎被中断了几秒钟。

我重写了三个区域:链接,表单帖子和对window.open()的调用。

我使用了类似的方法,在Jasarian's答案中剪切的第一个代码通过迭代标签和表单来覆盖链接和表单的目标。要覆盖window.open,我使用类似于以下的代码:

var oldWindowOpen = window.open; 
window.open = function(url, sName, sFeatures, bReplace) { 
    oldWindowOpen(url, '_self'); 
}; 
3

因此,经过少量研究后,很明显UIWebView类有意忽略将在新窗口中打开的链接(通过在标签上使用'target'元素或在onClick事件中使用javascript)。

我发现的唯一解决方案是使用javascript处理页面的html。虽然这适用于某些情况,但它不是防弹的。下面是一些例子:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].target='_self'; 
} 

这将改变使用“目标”元素在_self指向各个环节 - 代替_blank或_new。这可能会全面工作,不会出现任何问题。

其他片段,我发现遵循同样的想法,但与onClick事件:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].onclick=''; 
} 

这一个只是普通的讨厌。只有当链接标签正确设置了href元素,并且仅当onclick事件用于打开新窗口(使用window.open()或类似的东西)时,它才会起作用。讨厌的原因不应该需要解释,但是一个例子是如果onClick用于除了打开窗口之外的任何事情 - 这是一个非常常见的情况。

我想一个人可以进一步与此,并开始做一些字符串与onClick方法匹配,并检查window.open(),但再次,这是非常不理想。

2

以下是我如何获得twitter链接的工作(即,链接的网页试图用新窗口中打开):

-(BOOL)webView:(UIWebView *)mainWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     //Allows for twitter links 
     [self.mainWebView loadRequest:request]; 
     return NO; 
    } 

    return YES; 

} 
0
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
    theConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = YES; 

    webView1 = [[WKWebView alloc] initWithFrame:self.webView.frame configuration:theConfiguration]; 
    webView1.navigationDelegate = self; 
    webView1.UIDelegate = self; 
    [self.view addSubview:webView1]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
     NSString *htmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     NSLog(@"htmlString: %@", htmlString); 
     [webView1 loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"your url"]; 
    }]; 

    [dataTask resume]; 
相关问题