2017-07-17 1 views
0

J'utilise un WKWebView avec un Javascript pour ajouter des éléments à la page. Une version simplifiée serait:Swift/WebKit: Mise à jour HTML dans WKWebView avec Javascript

test.html:

<!doctype> 
 
<html> 
 
    <head> 
 
     <script type="text/javascript"> 
 
      function addLogItem() {     
 
       document.getElementById("logItems").innerHTML += "New log item<br>"     
 
       return document.documentElement.innerHTML.toString() 
 
      } 
 
     </script> 
 
    </head> 
 
    <body> 
 
     <div id = "logItems"> 
 
     Log items:<br> 
 
     </div> 
 
    </body> 
 
</html>

Dans un ViewController, j'appelle la fonction addLogItem après que la page a terminé le chargement:

func viewDidLoad() { 
     webView.navigationDelegate = self 
     let url = Bundle.main.url(forResource: "test", withExtension: "html")! 
     webView.load(URLRequest(url: url)) 
    } 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     webView.evaluateJavaScript("addLogItem()") { result, error in    
      print(result!) 
     } 
    } 

La console imprimera le résultat correct, avec une nouvelle ligne "Nouvel élément de journal
" ajoutée:Cependant, WebView dans la page affiche toujours la page d'origine dans l'application, sans la ligne "New log item" comme si innerHTML n'avait jamais changé. Si j'appelle la même fonction Javascript depuis le fichier HTML, comme ci-dessous, le WebView sera mis à jour avec la nouvelle ligne "Nouvel élément de journal", ce qui suggère que le code JavaScript fonctionne et que le problème est lié à la WKWebView gère la méthode evaluateJavaScript.

setTimeout(addLogItem,1000); 

Pourquoi ne pas mettre à jour son contenu webView et pourquoi ne pas montrer la nouvelle ligne qui a été ajoutée par la fonction JavaScript?

Répondre

0

Mystère résolue. J'ai en quelque sorte réussi à avoir une deuxième vue web invisible dans le contrôleur de vue et appelé les méthodes javascript dans l'invisible.