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?