2010-08-18 11 views
6

Sto provando a eseguire alcuni JS prima che l'evento onLoad della pagina venga attivato.JavaScript interrotto nella callback "Start Load" di UIWebView

Ma ho problemi con successo chiamando stringByEvaluatingJavaScriptFromString nel metodo delegato webViewDidStartLoad.

Per riprodurre il problema, è possibile utilizzare il seguente codice. implementazione

Delegato:

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

Visualizza questa 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> 

Questa pagina funziona sulla prima vista ("Tutto è OK"), ma non su tutte le ricariche, indipendentemente dal metodo di ricarica. Come probabilmente ti aspetti, anche questo non funziona nel delegato shouldStartLoadWithRequest.

Ho anche provato ad eseguire il javascript immediatamente dopo webViewDidStartLoad con performSelector:withObject:afterDelay:0, senza risultato.

Qualche idea?

+0

Qualche soluzione per questo? – Tudorizer

+0

Sì, vedi il mio commento qui sotto. –

risposta

1

sono riuscito a farlo funzionare con 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

Apprezzo che abbiate trovato il tempo di rispondere, Chris. Tuttavia, questo non sembra una soluzione. A meno che il server non impieghi molto tempo a rispondere, è probabile che questo timer non si attivi quando necessario. Sto davvero cercando una soluzione deterministica, che non dipenda dai timer. –

+0

A proposito, funziona con un intervallo di 0. Ma è meglio creare il timer in webViewDidStartLoad e invalidarlo sia in webViewDidStartLoad che in webViewDidEndLoad, piuttosto che mantenerlo sempre in esecuzione. Questo sembra anche supportare la teoria che webViewDidStartLoad viene chiamato prima di un'operazione di pulitura e l'oggetto della finestra viene rimosso prima che il frame Web venga configurato per la vista della pagina successiva. –

0

Bisogna fare qualcosa di simile:

implementazione Delegato:

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

file 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

Questo in realtà riscriverebbe il contenuto della visualizzazione Web. Stavo cercando un modo per indurre la pagina a pensare che fosse Flash, manipolando l'oggetto finestra prima che la vista eseguisse un codice. –

Problemi correlati