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

StackOverflow https://stackoverflow.com/questions/1218493

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Спасибо

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

Это было полезно?

Решение 2

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

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

Другие советы

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

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

}

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

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top