Как определить разницу между загрузкой iframe и загрузкой всей страницы в UIWebView? - PullRequest
12 голосов
/ 02 августа 2009

В событии [webView: shouldStartLoadWithRequest: navigationType:] как вы можете определить разницу между iframe, который загружает контент, и всем контентом, загружающим страницу? Похоже, что оба вызывают одно и то же событие с одинаковыми аргументами, единственное различие заключается в том, что URL-адрес будет загружен, поэтому невозможно определить разницу между ними.

Я подумал о нескольких способах увидеть разницу:

  • Разобрать исходный код страницы и сохранить список всех атрибутов iframe src, предположим, что если загрузка URL-адреса является одной из тех, что в моем списке, это iframe. Конечно, это предположение может быть неверным, если оно действительно перейдет на страницу.
  • То же, что и выше, но запустите JavaScript на странице и получите атрибуты iframe src.
  • Используя JavaScript, настраивайте хуки для каждого пользователя, пытающегося перейти на страницу, аналогично http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • Используя JavaScript, настройте хуки непосредственно перед тем, как iframe попытается загрузить данные (не знаю, как бы я это сделал).
  • Измените атрибут src каждого iframe, добавив специальную строку в конец его атрибута src, например. "# IFrame-загрузка". Загрузите UIWebView с этим измененным исходным кодом. Хотя это будет работать только для iframes, которые существовали на исходной странице, как это было запрошено в первый раз, но не для тех, которые загружаются динамически, например через JavaScript.
  • Дайте странице нормально загрузиться, вернув YES в событии [webView: shouldStartLoadWithRequest: navigationType:], и после завершения загрузки проверьте, изменился ли URL-адрес WebView ... перенаправление страницы, если нет, это, вероятно, означает, что это был iframe, который был загружен.
  • Используя JavaScript, переопределите установщик свойства window.location, чтобы запустить мой собственный код, прежде чем он фактически изменит местоположение окна. Затем я мог бы связаться с Objective-C, чтобы он знал, что следующая загрузка будет перенаправлением. Это единственный способ перенаправления в JavaScript?

Какой лучший способ сделать это? Можете ли вы придумать способы, о которых я не подумал? Есть ли у iframes специальное событие / свойство, которым я мог бы помочь с помощью JavaScript?

Спасибо

Обновление : это не так просто, как просто проверить навигационный тип. Хотя нажатие на ссылку для открытия новой страницы будет отображаться как navigationType = 0, редирект JavaScript (с изменением window.location) будет отображаться как navigationType = 5. Загрузка iframe также отображается как navigationType = 5. Так что когда navigationType = 5, вы не знаете, изменили ли URL-адреса всей страницы с помощью JavaScript или это просто загрузка iframe на той же странице.

Ответы [ 3 ]

38 голосов
/ 28 февраля 2012
 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];

}
6 голосов
/ 08 апреля 2010

Я только что использовал этот метод:

Пусть страница загружается нормально, возвращая YES в событии [webView: shouldStartLoadWithRequest: navigationType:], и после завершения загрузки посмотрите, изменился ли URL-адрес WebView ... если это произошло, значит, это было перенаправление страницы если нет, то это, вероятно, означает, что был загружен iframe.

2 голосов
/ 21 января 2011

Я успешно использовал поле HTTP «referer» (фактический заголовок написан с ошибкой), чтобы обнаружить это. Это должен быть либо URL главной страницы (доступной из веб-обзора), либо что-то еще - возможно, фрейм.

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...