2010-08-18 6 views
6

Estoy intentando ejecutar algunos JS antes de que se active el evento onLoad de la página.JavaScript interrumpido en la devolución de llamada "Iniciar carga" de UIWebView

Pero estoy teniendo problemas para llamar con éxito a stringByEvaluatingJavaScriptFromString en el método delegado webViewDidStartLoad.

Para reproducir el problema, puede usar el siguiente código. aplicación

Delegado:

-(void)webViewDidStartLoad:(UIWebView *)webView { 
    [webView stringByEvaluatingJavaScriptFromString:@"window.valueHasBeenSet=true"]; 
} 

Ver este código HTML:

<html> 
<head></head> 
<body> 

<script type="text/javascript" charset="utf-8"> 
    if (window.valueHasBeenSet) 
    { 
     // We enter this branch the first time 
     document.write('<h3>Everything is OK. Value has been set.</h3>'); 
    } 
    else 
    { 
     // We incorrectly enter this branch on reloads 
     document.write('<h3>Error. Value has not been set.</h3>'); 
    } 
</script> 

<a href="javascript:window.location.reload()">Reload</a> 

</body> 
</html> 

Esta página funciona en la primera vista ("Todo está bien"), pero no en todas las recargas, independientemente del método de recarga. Como probablemente esperaría, esto tampoco funciona en el delegado shouldStartLoadWithRequest.

También intenté ejecutar el javascript inmediatamente después de webViewDidStartLoad con performSelector:withObject:afterDelay:0, fue en vano.

¿Alguna idea?

+0

¿Alguna solución para esto? – Tudorizer

+0

Sí, mira mi comentario a continuación. –

Respuesta

1

logré hacer que funcione utilizando un NSTimer

- (void)viewDidLoad { 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
} 

-(void)update{ 
    if (Progress.progress <= 1.0) { 
     [website stringByEvaluatingJavaScriptFromString:@"window.valueHasBeenSet=true"]; 
    } 
} 
+0

Le agradezco que se tome el tiempo para responder, Chris. Sin embargo, esto no parece una solución. A menos que el servidor demore mucho tiempo en responder, es probable que este temporizador no se active cuando sea necesario. Realmente estoy buscando una solución determinista, que no dependa de temporizadores. –

+0

Por cierto, esto funciona con un intervalo de 0. Pero es mejor crear el temporizador en webViewDidStartLoad e invalidarlo en webViewDidStartLoad y webViewDidEndLoad, que mantenerlo siempre en ejecución. Esto también parece apoyar la teoría de que se llama a webViewDidStartLoad antes de una operación de limpieza, y el objeto de la ventana se destroza antes de que el marco web se configure para la vista de la página siguiente. –

0

Hay que hacer algo como esto:

aplicación Delegado:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    NSLog(@"webViewDidFinishLoad"); 
    [webView stringByEvaluatingJavaScriptFromString:@"foo(true);"]; 
} 

archivo html:

<html> 
<head></head> 

<script type="text/javascript" charset="utf-8"> 
function foo (value) { 
    if (value) 
    { 
     // We enter this branch the first time 
     document.write('<h3>Everything is OK. Value has been set.</h3>'); 
    } 
    else 
    { 
     // We incorrectly enter this branch on reloads 
     document.write('<h3>Error. Value has not been set.</h3>'); 
    } 

    document.write('<a href="javascript:window.location.reload();">Reload</a>'); 
} 
</script> 
<body> 



</body> 
</html> 
+0

Esto realmente volvería a escribir el contenido de la vista web. Estaba buscando una forma de engañar a la página para que creara que tenía Flash, manipulando el objeto de ventana antes de que la vista ejecutara cualquier código. –

Cuestiones relacionadas