2012-01-04 2 views
13

Приложение, которое я разрабатываю, построено вокруг jQuery Mobile и некоторых Ajax для обновления частей страницы. Как и сайты, использующие автоматическое обновление, я хочу остановить обновление после некоторого условия (время/видимость/и т. Д.), Поэтому мой сервер не обманывается ненужными запросами. Приложение имеет экран состояния, который обычно проверяется пользователем, и, в идеале, мои скрипты будут знать, что окно браузера сосредоточилось, и было бы подходящим временем для обновления. Я делал это раньше в настольном WebApps, но я заметил много вариаций на подвижную части между различными платформами и браузерами, например:Как определить фокус браузера на мобильных устройствах?

  • window.onfocus() делает/не срабатывает, когда выгоды браузера фокус
  • window.onfocus() не/не срабатывают, когда вкладки переключаются в браузере
  • Javascript является/не подвешен между закладками переключателями и/или переключателями от браузера

Лучшее, что я смог сделать до сих пор, - это набор эвристик, которые смотрят на доступные события +, когда был связанное с пользователем, но оно неудобно и приводит к тому, что пользователь перескакивает назад на страницу и должен обновляться вручную. Не хорошо.

Любые умные приемы для решения этой проблемы?

+0

Альтернативным решением может быть проверка ввода пользователем. Как насчет того, чтобы вы устанавливали текущее время в переменной каждый раз, когда пользователь взаимодействует со страницей. Таким образом вы можете создать правило, которое вызывает только вызов ajax, если страница использовалась в течение последней минуты или двух. –

+0

Я сейчас это делаю. Это помогает, но в моем приложении есть обычный случай, когда пользователь просто переключается на веб-страницу или разблокирует свой телефон, чтобы посмотреть состояние (не требуется взаимодействие). – LVB

ответ

4

Если вы просто хотите знать, что окно браузера было не в фокусе, используйте функцию requestAnimationFrame.

window.requestAnimFrame = window.requestAnimationFrame || 
          window.mozRequestAnimationFrame || 
          <add browsers here> 

Затем в коде

var lastupdate = new Date() 
(function loop() { 
     var now = new Date(); 

     if (now - lastupdate > <some treshold like 1 second>) { 
      // browser was suspended and did come back to focus 
     } 
     lastupdate = now; 

     window.requestAnimFrame(loop); 
})(); 

Трюк в том, что браузеры не дают кадр анимации, если вкладка или окно находится вне фокуса. Обычные setInterval и setTimeouts будут по-прежнему работать. Этот цикл будет работать непрерывно, когда окно находится в фокусе, но накладные расходы минимальны, это называется 3-5 раз в секунду в мобильных устройствах.

+0

Я посмотрю на это. Мой непосредственный вопрос (без какого-либо расследования) будет заключаться в том, насколько широко это поддерживается. Благодарю. – LVB

+2

Это работает в устройствах IE9, Firefox, Chrome, Safari, Android и iOS (также на большинстве других мобильных телефонов). IT не работает AFAIK в любом более старом браузере, который не поддерживает холст HTML5. –

+1

По этому списку он не поддерживается в мобильных браузерах. http://caniuse.com/#feat=requestanimationframe ... Но сообщение дает более яркое представление: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – LVB

Смежные вопросы