#javascript #ios #swift #wkwebview
#javascript #iOS #swift #wkwebview
Вопрос:
Моя цель — скрыть встроенный в мое приложение WKWebView до тех пор, пока определенные элементы страницы (например, верхний и нижний колонтитулы) не будут удалены из DOM.
Мой текущий процесс выглядит следующим образом (см. фрагменты кода ниже):
- Установите для WKWebView значение hidden (после создания экземпляра и в
didStartProvisionalNavigation
перехватчике). - Запустите JavaScript, чтобы удалить элементы страницы в
didFinish navigation
перехватчике, установив WKWebView видимым в обработчике завершения.
override func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
webView.isHidden = true
}
override func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
var scriptContent = ""
do {
scriptContent = try String(contentsOfFile: GlobalVariables.mainScriptURL!, encoding: String.Encoding.utf8)
} catch {
print("Error loading JavaScript file.")
}
webView.evaluateJavaScript(scriptContent, completionHandler: { result, error in
webView.isHidden = false
})
}
GlobalVariables.mainScriptURL
Содержание:
$('header').hide();
$('footer').hide();
Когда выполняется приведенный выше код, я все еще иногда вижу заголовок до его удаления. Есть ли задержка между моим JavaScript, обновляющим DOM, и WKWebView, перерисовывающим его содержимое, которое я не могу рассмотреть? Как я могу гарантировать, что содержимое никогда не будет видно моим пользователям до запуска этого JavaScript и полного удаления этих элементов из DOM?
Ответ №1:
Да, к сожалению, я также заметил, что процесс рисования веб-контента WKWebView не обязательно синхронизирован с обратными вызовами в вашем приложении. Вы можете получить краткую вспышку неправильного содержимого до того, как произойдет рисование.
Я бы предложил исправить это путем внедрения JavaScript, который прослушивает событие DOMContentLoaded и выполняет его переформатирование, и все это в процессе веб-контента.
Если загружаемый контент принадлежит вам, отлично, вы можете просто добавить <script>
в <head>
.
Если у вас нет исходного документа, вы можете заглянуть в WKUserScript и WKUserContentController, которые должны позволить вам добавить свой собственный JavaScript без изменения исходного кода страницы.