Приостановить выполнение 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>