Открытие всплывающих ссылок в UIWebView, возможно? - PullRequest
7 голосов
/ 07 августа 2009

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

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

Я пытался установить точку останова на

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

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

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

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

Спасибо!

Ответы [ 4 ]

7 голосов
/ 07 августа 2009

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

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

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

var oldWindowOpen = window.open;
window.open = function(url, sName, sFeatures, bReplace) {
  oldWindowOpen(url, '_self');
};
3 голосов
/ 07 августа 2009

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

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

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 голосов
/ 16 апреля 2010

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

-(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 голосов
/ 14 ноября 2016
    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];
...