2011-10-24 26 views
5

Öncelikle kendi kendine yeten ve yalnızca gerektiğinde sunucuyla iletişim kurulan bir mobil web uygulaması üzerinde çalışıyorum. Şu anda, kullanılmakta olan kütüphaneler şunlardır:iOS 5 Safari JavaScript yürütme zaman aşımı aşıldı

  • jQuery biz iOS 5 serbest bırakılması ana kadar jQTouch

1.6.4

  • jQuery UI 1.8.3
  • Modifiye/yamalı versiyonu Ayrıca touchscroll.js'yi kullanıyor ancak artık Safari artık pozisyonu desteklediğinden artık gerekmiyor: sabit ve yerel kaydırma. iOS 5 sunulduğundan beri

    , görünüşte rastgele, bu özel duruma neden:

    JavaScript: Error undefined JavaScript execution exceeded timeout 
    

    kaldırılırken sonra, diyelim ki (zamanın daha bir çok kısa bir süre için çalışır hiçbir JS kodunun 1ms) Safari tarafından yürütülür. Sayfayı yenilemek, yeni bir sayfaya gitmek veya yeni bir alana gitmek hiç bir etkisi olmaz. Her türlü JS kodu,

    for(var i = 0; i < 30; i++) ; 
    

    kadar basit bir şey bile istisna kaldırdı olmadan tarayıcı tarafından yürütülmez. Bunun tek yolu Safari'yi öldürmeye zorlamak ve yeniden başlatmaktır. Bir pencere.setTimeout (..., 1) uygulamasında herhangi bir uzaktan "ağır iş" kodu sarmak ya da UI güncellemeleri ama her şey için Web Çalışanlar avantajından yararlanmak mümkündür, ama çok gibi görünmüyor Uygulama olarak iyi bir çözüm oldukça büyük ve önemli bir yeniden yazma gerektirecektir.

    Daha önce bu sorunla karşılaştı mı? Safari'yi bu kırık duruma sokacak gibi görünen tek bir kod parçası olmadığı ve görünüşte rastgele görülebileceği için, böyle bir şeyi hata ayıklama hakkında nasıl giderdiniz?

    Ben JS motorun zaman aşımı yaparak mobil Safari'de olduğunu anlamaya çalıştı aşağıdaki:

    var start, end; 
    start = new Date(); 
    
    try { 
        while(true); 
    } catch (ex) { 
        alert('test'); 
    } 
    
    end = new Date(); 
    console.log(Number(end) - Number(start) + 'ms'); 
    

    Ne yazık ki bunun yakalanmış olamaz bu yüzden bu zaman aşımı istisna JS istisna değildir görünüyor bir deneme/yakalama bloğu; Ancak, maksimum zaman aşımı süresi birkaç saniye içinde gerçekleşir. Uygulamamızdaki kodların hiçbiri tarayıcı/JS motorunu bu kadar uzun bir süre için kilitlemiyor (korkunç bir UX sağlayacağı için) ve bunların büyük bir kısmı muhtemelen 300 ms'lik bir yürütme süresine sahip değillerse ("ağır görev" de dahil olmak üzere).

  • +0

    Aynı sorunu yaşıyorum ve Interval veya WatchPosition kullanma - intead Jquery Quicksand Plugin kullanıyorum ... ne yapacağımı tam olarak bilmiyordum. – Ash

    +0

    Tarayıcınızın bozuk bir durumda mı yoksa yürütmenin sadece zaman aşımına uğradığını mı yoksa komut dosyaları hala çalışıyor mu? Bu eklentiler CSS animasyonlarını desteklemiyorsa, Quicksand veya jQuery UI gibi eklentileri mobil geliştirme için kullanmazdım. Yazılım animasyonları oldukça yoğun kaynaklıdır ve bir mobil tarayıcıda kolayca zaman aşımına uğrayabilir. Bunu kullanmakta ısrar ederseniz, onu mutlak konumlandırma ve döngü yerine CSS animasyonları, dönüşümleri ve geçişleri kullanmaya yeniden yazmayı düşünürdüm. CSS yaklaşımı, Safari'de hızlandırılmış bir donanımdır ve * çok daha iyi bir performansa sahiptir. – illvm

    cevap

    0

    WatchPosition kullanıyor musunuz? öyleyse şu cevaba bakın: JavaScript execution exceeded timeout

    IOS 5'ten beri saçlarımı bu sorundan kurtarıyorum - Acılarınızı hissediyorum!

    +0

    değilim, ancak iş arkadaşım, bu uygulamadan önce erişilen başka bir etki alanındaki başka bir sayfadaydı. Ancak, işleyicideki aralığı temizlemeden setInterval kullanıyorum. İşleyici çağrıldığında aralığın silinmesi için aralığı değiştirdim ve aralığı yeniden başlattım ve o zamandan beri sorun olmadı. İki konuyla ilgili olup olmadığını merak ediyorum. – illvm

    +0

    ilginç - sorun olmadan birkaç setIntervals kullanıyorum ... Ben test edeceğim her tarayıcı bu hataları atmıyor çünkü bir çeşit iOS5 mobil safari hata olması gerektiğini düşünüyorum. Yine de bir çözüm bulduğuna sevindim! –