可以在UIWebView中打开弹出链接吗?

时间:2009-08-07 14:54:10

标签: iphone objective-c uikit uiwebview popup

我有一个UIWebView,我在我的应用程序中用作嵌入式浏览器。

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

我试过了

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

然后选择一个可以打开弹出窗口的链接,并且永远不会遇到断点。 有什么办法可以拦截弹出链接的选择并获取URL并正常加载吗?

我对在应用程序本身中显示一个弹出窗口不感兴趣,我只想在弹出窗口中加载的任何内容的URL加载到主webview本身。

这可能吗?

谢谢!

4 个答案:

答案 0 :(得分:7)

我也遇到过这种情况,HTML重写是我能想到的最好的解决方案。我遇到的最大问题是,在调用webViewDidFinishLoad:方法之前,Web浏览器是交互式的,最长可达几秒钟,因此链接似乎会被破坏几秒钟,直到它们被重写为止。 / p>

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

我在Jasarian's回答中使用了类似的方法来截断第一个代码,通过遍历标记和表单来覆盖链接和表单的目标。要覆盖window.open,我使用了类似于以下内容的代码:

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

答案 1 :(得分:3)

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

我找到的唯一解决方案是使用javascript操纵页面的html。虽然这适用于某些情况,但它不是防弹的。以下是一些例子:

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

这将更改使用'target'元素指向_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 :(得分: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;

}

答案 3 :(得分: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];