Скрывать WKWebView до загрузки страницы и запуска JavaScript

#javascript #ios #swift #wkwebview

#javascript #iOS #swift #wkwebview

Вопрос:

Моя цель — скрыть встроенный в мое приложение WKWebView до тех пор, пока определенные элементы страницы (например, верхний и нижний колонтитулы) не будут удалены из DOM.

Мой текущий процесс выглядит следующим образом (см. фрагменты кода ниже):

  1. Установите для WKWebView значение hidden (после создания экземпляра и в didStartProvisionalNavigation перехватчике).
  2. Запустите 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 без изменения исходного кода страницы.