2009-08-02 41 views
11

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

he pensado en algunas maneras de decir la diferencia sin embargo:

  • analizar el código fuente de la página y almacenar una lista de todos los atributos iframe src, se supone que si la carga es una url de los que están en mi lista es un iframe. Por supuesto, esta suposición puede ser incorrecta si realmente navega a la página.
  • Igual que el anterior, pero ejecute JavaScript en la página y obtenga los atributos src iframe.
  • Uso de JavaScript, estableció ganchos para cada vez que un usuario intenta navegar a una página, similar a http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • Uso de JavaScript, establecer ganchos justo antes de un iframe trata la carga de datos (no estoy seguro de cómo iba a hacer algo así) .
  • Modifique el atributo src de cada iframe para incluir una cadena especial al final de su atributo src, p. "# iframe-loading". Cargue UIWebView con este código fuente modificado. Aunque esto solo funcionará para iframes que existían en la página original tal como se consultó la primera vez, no aquellos que se cargan dinámicamente, p. a través de JavaScript.
  • Deje que la página se cargue normalmente al devolver YES en el evento [webView: shouldStartLoadWithRequest: navigationType:], y una vez que termine de cargar, vea si la URL de WebView cambió o no ... si eso significaba que era una página redirigir si no, probablemente significa que fue un iframe el que se cargó.
  • Usando JavaScript, anulo el setter de propiedades window.location para ejecutar mi propio código antes de que realmente cambie la ubicación de la ventana. Podría comunicarme con Objective-C para informarle que la próxima carga va a ser una redirección. ¿Es esta la única forma de redirigir en JavaScript?

¿Cuál es la mejor manera de hacerlo? ¿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 la comprobación de la navigationType. Aunque hacer clic en un enlace para abrir una nueva página aparecerá como navigationType = 0, aparecerá una redirección de JavaScript (cambiando window.location) como navigationType = 5. Una carga de iframe también aparece como navigationType = 5. Entonces cuando navigationType = 5, no se sabe si toda la página cambió las URL a través de JavaScript o si se trata simplemente de un iframe que se está cargando en la misma página.

+1

Así como un FYI, usted debe evitar referirse a Apple tipos enumerados por sus valores enteros - por ejemplo, navigationType == 5. Debería, en cambio, en el código, referirse a ellos por sus nombres, p. UIWebViewNavigationTypeOther. ¿El compilador lo reduce a un entero simple? Sí. Pero hacerlo de la manera correcta lo deja aislado si cambia el orden de sus tipos enumerados, o especifica un entero específico en el futuro. –

Respuesta

6

simplemente he utilizado este método:

Vamos a la carga de la página normalmente mediante la devolución de SI en el [web View: shouldStartLoadWithRequest: navigationType:] caso, y una vez que se realiza la carga, a ver si la URL de la vista Web cambió o no ... si lo hizo significa que fue una redirección de página, si no, probablemente significa que se cargó un iframe.

2

He utilizado con éxito el campo HTTP "referer" (el encabezado real está mal escrito) para detectar esto.Esta debería ser la URL de la página principal (disponible desde la vista web) u otra cosa, probablemente un marco.

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

Eso no funciona en estos días. Sin encabezado de referencia. Obtengo: { Aceptar = "text/html, application/xhtml + xml, application/xml; q = 0.9, */*; q = 0.8"; "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 como Mac OS X) AppleWebKit/536.26 (KHTML, como Gecko) Móvil/10B141"; } – philoye

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

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

} 
+0

la única respuesta rudo – Fattie

Cuestiones relacionadas