2009-08-07 25 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];