Приостановить выполнение JavaScript в UIWebView

Я поставил несколько UIWebView бок о бок в UIScrollView. Каждый UIWebView включает в себя представление "веб-браузер", в котором отображается локальный файл HTML. К сожалению, я не знаю, как загрузить веб-просмотры в фоновом режиме и в то же время предотвратить или остановить выполнение функций JavaScript, включенных в файлы HTML. Я имею в виду "на заднем плане", поскольку я смотрю первые несколько панелей, а пока остальные панели просто ленивы загружаются молча. Я видел разные приложения (например, pugpig) - это ленивы загружает страницы HTML и останавливает анимацию JavaScript - он может каким-то образом остановить JavaScript, чтобы оживить весь эффект затухания, который я часто использую на своих HTML-страницах между переключателями табуляции и на данный момент Я загружаю панель, которая продолжает анимацию затухания.

Итак, вопрос:

Как приостановить анимацию JavaScript и предотвратить проблемы с памятью с помощью кода Objective-C и как я могу продолжить анимацию затухания после отображения панели?

Ответ 1

Вы пытались ввести JavaScript (т.е. - (NSString *) stringByEvaluatingJavaScriptFromString: (NSString *) script), который наблюдает onblur и onfocus window, или pageshow и pagehide? Этот пост предлагает несколько решений для этого.

Итак, вы можете попробовать что-то вроде

$(window).blur(function(){
  // when the web view loses focus
});
$(window).focus(function(){
  // when the web view gains focus
});

Если это не удается, вы можете попробовать события pagehide и pageshow:

function pageShown(evt)
{
    if (evt.persisted)
        // The page was just restored from the Page Cache
    else
        // The initial load. This is the same as the page load event
}

function pageHidden(evt)
{
    if (evt.persisted)
        // The page was suspended and placed into the Page Cache
    else
        // This is the same as the page unload event
}

window.addEventListener("pageshow", pageShown, false);
window.addEventListener("pagehide", pageHidden, false);

Ответ 2

Я думаю, вы можете управлять анимационными javascripts, которые запускаются в HTML (вы сказали, что страница является локальной). Что бы я сделал, это обернуть анимацию в функции JS, которая будет вызвана из Cocoa (там есть множество ссылок для StackOverFlow, например - (NSString *) stringByEvaluatingJavaScriptFromString: (NSString *) script).

Тогда я бы создал стек, у которого есть запись для каждой из HTML-страниц, которые вы хотите ленивой загрузки. На каждом UIScrollView scrollViewDidScroll: Я бы проверял, выполнил ли прокрутка в размере всего размера веб-просмотра, если бы я поместил эту запись из стек и вызовите функцию JAJAID startAnimation, о которой мы упоминали ранее, на следующем веб-просмотре.

Если вам нужна двусторонняя связь (от javascript до cocoa), например, чтобы указать, что анимация завершена, вы можете использовать JSBridge. (Как мне вызвать метод Objective-C из JavaScript в UIWebView?)

Ответ 3

Возможно, вы можете попытаться оценить (используя stringByEvaluatingJavaScriptFromString) целенаправленный фрагмент кода javascript и заставить js-интерпретатор задохнуться?

<script> var j =     // note: missing value, error!
</script>