Возможно открытие всплывающих ссылок в UIWebView?

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

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

Я пробовал точку останова на

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

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

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

Это возможно?

Благодаря!

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

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

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

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

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

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

 links = document.getElementsByTagName('a'); for (i=0; i 

Это изменит все ссылки, которые используют элемент «target», чтобы указать на _self, вместо _blank или _new. Это, вероятно, будет работать по всем направлениям и не представляет никаких проблем.

Другой fragment, который я нашел, следовал той же идее, но с событием onClick:

 links = document.getElementsByTagName('a'); for (i=0; i 

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

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

Вот как я получаю ссылки на Twitter (т. Е. Ссылку на страницы, которые пытаются открыть с новыми windowsми):

 -(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; } 
  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]; 
  • UIPopoverPresentationController на iOS 8 iPhone
  • UIImage от CALayer - iPhone SDK
  • Выясните, нажал ли пользователь кнопку «Назад» в controllerе uinavigation?
  • Проблема UITableView при использовании отдельного делегата / источника данных
  • UIPageViewController не возвращает никаких распознавателей жестов в iOS 6
  • NSDateFormatter с 24 часами
  • iPhone - Что такое reuseIdentifiers (UITableViewCell)?
  • UITextField: перемещение вида при появлении клавиатуры
  • Выполнение команд оболочки с помощью NSTask - Objective-C Cocoa
  • Как я могу округлить значение float до двух постсимвольных позиций?
  • Ошибка: протокол недоступен, сброс backtrace
  • Interesting Posts

    Сокращение времени ожидания доступа к памяти в Windows (особенно для съемных носителей)?

    Загрузка / кеширование Карт Google для автономного использования

    Как добавить приложение для не-программных файлов в диалоговое окно OpenWith?

    Как создавать элементы управления динамически в MVC 3 на основе XML-файла

    Плохое соединение Wi-Fi – ПК: 5 бар, маршрутизатор: 1 бар

    Накладные расходы .NET-массива?

    Как использовать hibernate с MS Access?

    Понимание подсчета ссылок с помощью Cocoa и Objective-C

    Почему диспетчер загрузки bitsadmin.exe не работает для меня?

    JAXB сортирует XMPP stanzas

    Единая форма Google для нескольких листов

    WIndows Vista для обновления совместимости с драйверами устройств Windows 10

    Изменение строки состояния Цвет для конкретных ViewControllers с использованием Swift в iOS8

    Ошибка: не удалось найти файл локальной рабочей области (‘angular.json’)

    Как конкатенировать строку и int в C?

    Давайте будем гением компьютера.