¿Cómo saber la diferencia entre una carga de iframe y la carga de una página completa en un UIWebView?

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

  •  10-07-2019
  •  | 
  •  

Pregunta

En el evento [webView: shouldStartLoadWithRequest: navigationType:], ¿cómo puede distinguir la diferencia entre un iframe que está cargando contenido y toda la página cargando contenido? Parece que ambos llaman a este mismo evento con los mismos argumentos, la única diferencia es la URL que se cargará, por lo que no hay forma de saber la diferencia entre los dos.

Sin embargo, he pensado en algunas formas de notar la diferencia:

  • Analice el código fuente de la página y almacene una lista de todos los atributos src de iframe, suponga que si la carga de URL es una de las de mi lista, es un iframe. Por supuesto, esta suposición podría ser incorrecta si en realidad navega a la página.
  • Igual que el anterior, pero ejecute JavaScript en la página y obtenga los atributos de iframe src.
  • Usando JavaScript, configure enlaces para cada vez que un usuario intente navegar a una página, similar a http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • Usando JavaScript, configure ganchos justo antes de que un iframe intente cargar datos (no estoy seguro de cómo haría algo como esto).
  • Modifique el atributo src de cada iframe para incluir una cadena especial al final de su atributo src, p. " # cargando iframe " ;. Cargue UIWebView con este código fuente modificado. Aunque esto solo funcionará para iframes que existían en la página original tal como fue consultada la primera vez, no para aquellos que se cargan dinámicamente, p. a través de JavaScript.
  • Deje que la página se cargue normalmente devolviendo YES en el evento [webView: shouldStartLoadWithRequest: navigationType:], y una vez que termine de cargar, vea si la URL de WebView cambió o no ... si lo hizo eso significa que fue una redirección de página, si no, probablemente significa que se cargó un iframe.
  • Usando JavaScript, anule el configurador de propiedades window.location para ejecutar mi propio código antes de que realmente cambie la ubicación de la ventana. Entonces podría comunicarme con Objective-C para hacerle saber que la próxima carga realmente será una redirección. ¿Es esta la única forma de redirigir en JavaScript?

¿Cuál es la mejor manera de hacer esto? ¿Puedes pensar en alguna forma en la que no haya pensado? ¿Los iframes tienen un evento / propiedad especial que podría manipular con JavaScript para ayudarme?

Gracias

Actualización : no es tan simple como simplemente verificar el tipo de navegación. Aunque hacer clic en un enlace para abrir una nueva página aparecerá como navigationType = 0, una redirección de JavaScript (cambiando window.location) aparecerá como navigationType = 5. Una carga de iframe también aparece como navigationType = 5. Entonces, cuando navigationType = 5, no sabe si la página completa cambió las URL a través de JavaScript o si es simplemente un iframe que se carga en la misma página.

¿Fue útil?

Solución 2

Acabo de usar este método:

  

Deje que la página se cargue normalmente devolviendo SÍ en el evento [webView: shouldStartLoadWithRequest: navigationType:], y una vez que termine de cargar, vea si la URL de WebView cambió o no ... si lo hizo, eso significa que fue una redirección de página si no, probablemente significa que se cargó un iframe.

Otros consejos

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

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

}

He utilizado con éxito el HTTP " referer " (el encabezado real está mal escrito) para detectar esto. Esta debería ser la URL de la página principal (disponible en la vista web) o algo más, probablemente un marco.

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top