2009-07-30 17 views
8

DIV ürününü dinamik olarak değiştirmek için innerHTML özelliğini kullanarak, işlemin tamamlanması birkaç saniye sürecek bir işlemle ilgili rapor verin. Sorun, Firefox'ta, sayfanın, betik bittikten sonraya kadar bu değişikliği yansıtacak şekilde yeniden oluşturulmamasıdır. Bu uygulama halsiz hissettiriyor. Daha fazla komut dosyası çalışıyor olsa bile, HTML'deki değişikliklerin hemen gösterilmesini sağlamanın bir yolu var mı?Scriptim biraz yoğun işlem yaparken tarayıcının yeniden çizilmesini nasıl zorlayabilirim?

cevap

14

Tarayıcı tek parçalıdır. Komut dosyası çalışırken, tarayıcı başka bir şey yapamaz. Bir ilerleme ölçer gibi bir şey yapmak isterseniz, setTimeout() veya setInterval()'u kullanmanız ve görevinizi bir aralıkta çalışacak daha küçük parçalara ayırmanız gerekir. Bu, komut dosyası çalıştırmaları arasında, tarayıcıyı yeniden tarayabilen tarayıcıya geri kontrol sağlayarak boşluk bırakır.

+0

Tarayıcının tek iş parçacığı olduğu durum böyle görünmüyor. Bir javascript iş parçacığı vardır, ancak sayfayı işleyen ve DOM –

+0

'u yönlendiren paralel bir iş parçacığı vardır. Bu gerçekten hangi * tarayıcıdan bahsettiğinize bağlıdır. Bazıları şimdi, her tarayıcının içeriği ayrı bir süreç olan, çok işlemcili modeliyle krom gibi yapabilir ve krom da kendi işlemidir. ancak (1) ile herhangi bir tarayıcıyı kolayca asabilirsiniz. Ne tür tarayıcı kullandığınız, tarayıcının nasıl oluşturulduğuna bağlıdır. – Breton

+0

js dizisini while (1) {} ile çağırabilir, ancak bu, dom manipülasyonu veya içerik oluşturma için kullanılan başka bir iş parçacığı olmadığı anlamına gelmez. Bu, JS iş parçacığının muhtemelen diğer iş parçacıklarının çalışmasını engelleyebileceği anlamına gelir. Ve iş parçacıklarının tarayıcı proccess modeliyle herhangi bir ilişkisi olmayabilir (sayfa başına bir işlem veya tüm tarayıcı penceresi için bir işlem) –

6

Komut dosyanızı düzenli aralıklarla kesmeyi deneyin. Sen nextFunction sizin uzun işleme devam fonksiyonudur uzun gecikme olmadan gerekli kesinti sağlamak için

setTimeout(nextFunction, 0); 

kullanmak gerekir.

İlgili konular