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

В событии [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 попытается загрузить данные (не уверен, как я буду делать что-то подобное).
  • Измените каждый атрибут iframe src, чтобы включить специальную строку в конце атрибута src, например. "# IFrame-загрузка". Загрузите UIWebView с помощью этого модифицированного исходного кода. Хотя это будет работать только для iframes, которые существовали на исходной странице, поскольку он был запрошен в первый раз, а не те, которые загружаются динамически, например. через JavaScript.
  • Обычно загружать страницу, возвращая YES в событие [webView: shouldStartLoadWithRequest: navigationType:], и после того, как она была загружена, посмотрите, изменился ли URL WebView или нет... если это так, то это означает, что это перенаправление страницы, если это не означает, что это был iframe, который был загружен.
  • Используя JavaScript, переопределите средство определения свойств window.location для запуска моего собственного кода, прежде чем он действительно изменит местоположение окна. Затем я мог бы связаться с Objective-C, чтобы сообщить ему, что следующая загрузка на самом деле будет перенаправлением. Это единственный способ перенаправления в JavaScript?

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

Спасибо

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

Ответ 1

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

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

Ответ 2

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

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

}

Ответ 3

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

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;