2015-01-08 19 views
12

Sto cercando di chiamare una funzione esistente da un sito remoto in un WKWebview:WKWebview evaluateJavascript non funziona, genera un errore

function addtext (text) { 
jQuery("#webviewtest").html(text); 
} 

Con:

[self.WebView evaluateJavaScript:@"addtext(\"This is a text from app\");" completionHandler:^(id Result, NSError * error) { 
    NSLog(@"Error -> %@", error); 
}]; 

Ma questo sta gettando un errore :

Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo=0x170c788c0 {NSLocalizedDescription=A JavaScript exception occurred} 

Questo è così semplice! Devo mancare qualcosa di veramente stupido!

+0

jQuery è caricato in quella pagina? – AstroCB

+0

Sì, è un sito web completamente funzionale, sto solo costruendo un ponte per far funzionare un login su Facebook. E la funzione funziona anche quando normalmente invoco il browser. –

+0

Prova senza jQuery: 'document.getElementById ('webviewtest'). InnerHTML = testo;'. Forse il metodo 'html' fallisce. – Pinal

risposta

27

Trovato una soluzione, era semplice come mi aspettavo, stavo aggiungendo il javascript prima della visualizzazione completa caricare il contenuto (prima di Dom Ready). Così ho dovuto spostare il mio codice al metodo delegato di seguito:

Spero che questo aiuta qualcuno.

+0

Questa è una soluzione! Ovviamente ma risparmia un sacco di tempo grazie. –

+0

Non funziona per me. – Jitendra

+0

Hai implementato il delegato? –

3

Ho scoperto che il problema era causato dal fatto che il webView:didFinishNavigation: veniva chiamato prima che il contenuto della pagina fosse effettivamente caricato. Penso che il sito web stia usando angularjs.

ho introdotto un ritardo manuale che sembrava d il trucco per me:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     print("loaded)") 
     //abtn_run(UIButton()) 
     self.perform(#selector(performAction), with: nil, afterDelay: 3.0) 


    } 

e ha fatto la mia chiamata qui:

func performAction() { 
      //This function will perform this after delay of 3 seconds 
    } 

Idealmente la soluzione migliore sarebbe avere un ascoltatore spingere un evento per angularjs "page ready" ma non sono sicuro che ciò sia possibile in wkwebview.

Problemi correlati