2012-01-04 31 views
13

Gelişmekte olduğum uygulama jQuery Mobile ve sayfanın bazı bölümlerini yenilemek için Ajax etrafında oluşturuldu. Otomatik yenilemeyi kullanan siteler gibi, bazı koşullardan (zaman/görünürlük/vb.) Sonra yenilemeyi durdurmak istiyorum. Böylece sunucum gereksiz isteklerle birlikte bombardımana tutulmuyor. Uygulama, kullanıcı tarafından genel olarak kontrol edilen bir durum ekranına sahiptir ve ideal olarak, betiklerim tarayıcı penceresinin odaklandığını bilecek ve yenilemek için iyi bir zaman olacaktır. Ben masaüstü webapps daha önce yaptım ama örneğin farklı platformlar ve tarayıcılar arasında mobil tarafta bir çok varyasyon fark ediyorum:Tarayıcı cihazlarına mobil cihazlarda nasıl odaklanır?

  • window.onfocus()/ateş etmiyor tarayıcı kazançları/sekmeler
  • JavaScript sekmesi anahtarlar arasında asılı ve/veya uzak tarayıcıdan geçer not/bir tarayıcıda açık olduğunda patlamaz()
  • window.onfocus odak

Şimdiye kadar yapabileceğim en iyi şey, mevcut olaylara baktığınız bir dizi sezgisel + sayfa ile kullanıcı etkileşimini etkiledi, ancak bu durum hantal ve kullanıcının sayfaya geri atlayıp el ile yenilemesi gereken durumlarda sonuçlanır. Harika değil.

Bunu çözmek için herhangi bir akıllı teknik var mı?

+0

Kullanıcı girişini kontrol etmek için alternatif bir çözüm olabilir. Kullanıcının sayfa ile her etkileşimde bulunduğu zamandaki bir saati değişkene ayarladığınız zaman. Bu şekilde, sayfa son dakika veya iki kez kullanılmışsa ajax çağrısını yalnızca tetikleyen bir kural oluşturabilirsiniz. –

+0

Şu anda bunu yapıyorum. Bu yardımcı olur, ancak benim uygulamada kullanıcının sadece web sayfasına geçtiği veya durumu bakmak için telefonunun kilidini açtığı yaygın bir durum var (etkileşim gerektirmez). – LVB

cevap

4

Tarayıcı penceresinin odak dışında olup olmadığını öğrenmek isterseniz, requestAnimationFrame işlevini kullanın.

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

Sonra kodunuzda

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); 
})(); 

Trick sekmesi veya pencere odak dışında ise tarayıcılar animasyon karesini vermeyin olmasıdır. Normal setInterval ve setTimeouts hala çalışır. Bu döngü, pencere odakta olduğunda sürekli olarak çalışacaktır, ancak yük minimumdur, mobil cihazlarda saniyede 3-5 kez çağrılır.

+0

Buna bir göz atacağım. Anket sorumlusu (soruşturma olmaksızın) bunun ne kadar desteklendiğidir. Teşekkürler. – LVB

+2

Bu, IE9, Firefox, Chrome, Safari, Android ve iOS aygıtlarında (diğer birçok mobil cihazlarda da) çalışır. BT, HTML5 tuvalini desteklemeyen eski tarayıcılarda AFAIK çalışmıyor. –

+1

Bu listeye göre, mobil tarayıcılarda iyi desteklenmemektedir. http://caniuse.com/#feat=requestanimationframe ... Ancak yazı daha parlak bir görünüm veriyor: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – LVB

İlgili konular