2009-08-07 3 views
6

У меня есть UIWebView, который я использую как встроенный браузер в своем приложении.Открытие всплывающих ссылок в UIWebView, возможно?

Я заметил, что ссылки на веб-страницах, открывающие новые окна, игнорируются без какого-либо вызова моего кода.

Я попытался breakpointing на

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

, а затем выбрать ссылку, которая откроет всплывающее окно, и точка останова никогда не хит. Есть ли что-нибудь, что я могу сделать, чтобы перехватить этот выбор всплывающей ссылки и получить URL-адрес и просто загрузить его в обычном режиме?

Мне не интересно отображать всплывающее окно в самом приложении, я просто хочу, чтобы URL-адрес того, что будет загружаться во всплывающем окне, загрузится в основное веб-представление.

Возможно ли это?

Спасибо!

ответ

7

Я столкнулся с этим, и переписывание HTML было лучшим решением, с которым я мог бы придумать. Самая большая проблема, с которой я столкнулся с этим подходом, заключается в том, что веб-браузер интерактивен на пару секунд, пока не будет вызван метод webViewDidFinishLoad: поэтому ссылки, похоже, будут разбиты на несколько секунд, пока они не будут перезаписаны.

Существует три области, которые я переписал: ссылки, сообщения формы и вызовы window.open().

Я использовал аналогичный подход для первого кода, отрезанного в Jasarian's, для того чтобы переписать цель для ссылок и форм путем итерации по тегам и формам. Чтобы переопределить window.open, я использовал код, подобный следующему:

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

Итак, после небольшого исследования ясно, что класс UIWebView целенаправленно игнорирует ссылки, которые будут открываться в новом окне (либо с помощью «целевого» элемента в теге, либо с помощью javascript в событии onClick).

Единственные решения, которые я нашел, - это манипулирование html страницы с помощью javascript. Хотя это работает в некоторых случаях, это не пуленепробиваемый. Вот некоторые примеры:

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=''; 
} 

Это один просто противно. Он будет работать только в том случае, если в теге link правильно установлен элемент href, и только если событие onclick используется для открытия нового окна (с помощью window.open() или чего-то подобного). Причины, по которым это неприятно, не должны объяснять, но один пример мог бы быть, если onClick используется для чего-либо, кроме открытия окна, что является очень распространенным случаем.

Я думаю, что с этим можно пойти дальше и начать выполнять некоторую строку, соответствующую методу onClick, и проверить window.open(), но опять же, это действительно далеко не идеально.

2

Вот как я щебет ссылки на работу (т.е.ссылка на страницы, которые пытаются открыть новые окна):

-(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];