2013-01-16 16 views
5

ı bu javascript fonksiyonu var diyelim oyala. Yukarıdaki javascript işlevini çalıştırdığımda, işlev çalışırken spini durdurur. here'dan bahsettiğime bakın. Temel olarak javascript, css animasyonlarını durdurur ve nedenini merak ettim ya da başka birinin bunu fark etmesi durumunda bir çözüm buldum. Bunu bir setTimeout (fn, 0) 'a koymaya çalıştım, burada fn uzun süreçti, fakat sonra bunun neden işe yaramayacağını da anladı (js çok iş parçacıklı değil). Bunu gören oldu mu?CSS Animasyonlar JavaScript fonksiyonunu çalıştırırken

Güncelleme: İlginç bir şekilde, tarayıcı arayüzüyle etkileşim hala etkilense de, bu durumun Safari'deki bir sorun olmadığı anlaşılıyor.

+0

Diğer her şeyin devam etmesine izin vermek için "uzun süren kodunuzu" parçalara ayırmanız gerekir. –

+0

Doğru, bunun düzeltileceğini bildiğim halde, bunu uygulamaya çalıştığım işlevler için geçerli bir çözüm değil. Fonksiyonlar daha küçük parçalara ayrılmaz değildir. Gerçekten de, yukarıda kesin problem için bir çözüm bulunup bulunmadığını kontrol ediyorum, ki bu da aynı şekilde parçalanamaz. –

cevap

5

Tarayıcı sayfası tek iş parçacıklı. Kullanıcı arayüzünü güncellemek, javascript programınızla aynı iş parçacığında gerçekleşir. Ayrıca Javascript kodu yürütülürken herhangi bir animasyonun yeni kareler çizmeyeceği anlamına gelir. Tipik olarak, bu büyük bir sorun değildir çünkü çoğu JS kodu çok hızlı bir şekilde tek bir animasyon çerçevesinden daha hızlı yürütülür.

En iyi tavsiyemiz basitçe şudur: Bunu yapma. JS motorunu bu kadar uzun süre kilitleme. Bunu yapmak için daha temiz bir yol bul.


Ancak, yapmanız gerekiyorsa, bir yolu vardır. HTML5's Web Workers API aracılığıyla ek bir iş parçacığı alabilirsiniz. Bu, eski tarayıcılarda desteklenmez, ancak ana web sayfasından ve kendi iş parçacığından bazı uzun süre çalışan CPU emme kodunu çalıştırmanıza izin verir ve daha sonra bu işlem tamamlandığında sayfanıza bir sonuç gönderir.

+0

Evet, web çalışanlarını gördüm. Web çalışanlarının DOM'a erişimi olup olmadığını biliyor musunuz? Çünkü uzun süren işlemim jQuery'de gerçekleşen tüm DOM güncellemeleridir ve bu da yavaştır. –

+0

@ChristianBankester Web Çalışanlar DOM'a erişemez. 'SetTimeout' kullanmanız gerekecek. – bfavaretto

+0

Ah, çalışmayan setTimeout kullanmayı denedim. Bu güncelleştirilmiş jsfiddle'a bakın: http://jsfiddle.net/JU4St/2/ –