Neden setTimeout, 0 fn () bazen faydalıdır.
Son zamanlarda JavaScript ile kod <select>
bir dinamik olarak yükleme oldukça kötü hata, neyin içine düşmüştüm. Bu dinamik <select>
önceden seçilmiş bir değer vardı yüklü. IE6, biz zaten vardı kod düzeltmek için seçilen <option>
, çünkü bazen <select>
selectedIndex
değeri olurdu dışarı senk ile seçilen <option>
index
öznitelik, aşağıdaki gibi:
field.selectedIndex = element.index;
Ancak, bu kod işe yaramıyordu. Alanı selectedIndex
doğru şekilde ayarlı olmasına rağmen, yanlış dizin seçili olmuyor. Eğer doğru zamanda alert()
bir deyim soktum ancak doğru seçenek seçili olur. Bu zamanlama sorunu çeşit olabilir düşünme, kod daha önce görmediğim bir şey rastgele denedim:
var wrapFn = (function() {
var myField = field;
var myElement = element;
return function() {
myField.selectedIndex = myElement.index;
}
})();
setTimeout(wrapFn, 0);
Ve bu işe yaradı!
Benim sorun için bir çözüm var, ama bu benim sorunum düzeltmeleri tam olarak bilmiyorum huzursuzum. Kimse resmi bir açıklama var mı? Ne tarayıcı sorunu "daha sonra 13**?" seçeneğini kullanarak, benim işlevini çağırarak kaçıyor muyum
CEVAP
Bu kooperatif çoklu görev yaptığın için çalışır.
Bir tarayıcı olan şeylerin sayısı çok fazla tek seferde yapmak zorunda, ve o sadece bir JavaScript yürütmek. Ama şeylerden biri JavaScript tarayıcı görüntüleme bir öğe oluşturmak için sormak için çok sık kullanılır. Bu genellikle eşzamanlı olarak özellikle JavaScript paralel olarak yürütülen, yapmış olduğu varsayılır ama bu durumda garanti yok ve JavaScript bekliyorum iyi tanımlanmış bir mekanizma yok.
Bu çözüm "" JavaScript yürütme işleme konuları konuşalım. pause Ve bu 14* *bir zaman aşımı ile olan etkisidir0yok. Böyle bir iş parçacığı/süreç verimi C. Ancak öyle görünüyor ki "bunu hemen" aslında verir tarayıcı bir şans için son yapmak olmayan bazı JavaScript şeyler var bekleyip bitirmek önce katılan yeni bir parça JavaScript.
(Aslında setTimeout()
yürütme sırasının sonunda yeniden sıralar yeni JavaScript. Daha uzun bir açıklama için bağlantılar için yorumlara bakın.)
IE6 sadece bu hata için daha açık olur, ama Mozilla Firefox eski sürümleri ve ortaya gördüm.
Neden boşluk meta etrafında bazen gere...
Neden Python karşılaştırma dizeleri ku...
Neden kitaplıkları bağlı emir bazen GC...
Neden't setTimeout döngüm iptal d...
Neden `git zula -p` bazen başarısız mı...