2013-11-02 17 views
6

AJAX aracılığıyla gönderilen HTML'yi enjekte eden bir web sayfam var. Bilmiyorum, a priori, içeriğin boyutu, ancak içeriği sayfaya göre boyutuna göre yerleştirmem gerekiyor.Bir tarayıcının takılı bir öğeyi boyamayı bitirdiğinde nasıl belirlenir?

  1. Seti Üst konteynerin opaklığını 0.
  2. için DOM'ye içerikler ekleyin: Burada çalışmıyor basit bir yaklaşım. Boyutları ölçün, örn. $el.outerWidth(true).
  3. İçeriği bu boyutlara göre yerleştirin.
  4. Ebeveyn taşıyıcısının opaklığını (arka) 1.0 olarak ayarlayın.

Bu yaklaşımdaki sorun, içeriğin oldukça karmaşık olması ve görüntüleri içermesidir. outerWidth() çağrıldığında, tarayıcı döndürülen boyutların doğru olmaması için ekranı yeniden boyamayı tamamlamamıştır. (İlginçtir, benim durumumda, başlangıç ​​boyutları her zaman beklediğim gibi değil, nihai değerlerden önemli ölçüde daha büyüktür.)

Sorunu 2 ve 3 numaralı adımlar arasında bir zamanlayıcı ayarlayarak azaltabilirim, ancak ne kadar uzun olursa olsun Zamanlayıcıyı yapıyorum, kesinlikle bazı sistemde onu aşacak bir tarayıcı olacak. Ve zamanlayıcıyı çoğu vakayı kapsayacak kadar uzun yaparsam, gereksiz gecikmeleri tanıyarak kullanıcıları daha hızlı sistemlerle cezalandıracaktır. Aşağıda atıfta bulunulan cevaplardan birkaçı bir setTimeout(fn, 0) yeterli olsa da, durumun böyle olmadığını buldum. 2012 MacBook Air'de 60 ms'ye kadar olan boya sürelerini ölçtüm ve bir cevap 500 ms.

Bir kerede Mozilla'nın benim problemimi çözmüş olabilecek bir onPaint event olması gibi görünüyor… eğer hala var ise ve diğer tarayıcılar onu benimsemişse. (Her ikisi de durum böyle değildir.) Ve Mutation Observers, öğelerdeki değişiklikleri bildirirken boya süresini hesaba katmıyor.

Çözümler veya yorumlar çok beğeni topladı. Aşağıda belirtildiği gibi, bu daha önce sorulmuştur ama soruların çoğu en az bir yaşında ve tekrar denemek için umutsuzum. Maalesef uygun cevap sunmuyoruz


İlgili sorular


Güncelleme: Eh, sadece orada görünen bu sorun için genel bir çözüm değildir. Özel durumumda, içerik yüklendikten ve düzen tamamlandıktan sonra güvenilir bir şekilde değiştirilecek bir özellik buldum. JavaScript, bu özelliğin değiştirilmesi için anketler. Hiç de zarif değil, ama bulabildiğim en iyi seçenek buydu.

+0

hangi görüntü 'ile DOM eklemeden hakkında: (a' setTimeout' ile) yürütme ertelenmesi, none' ve sonra yüksekliği/genişliğine göre şeyler düzenliyor? –

+0

Bir resim indirildikten sonra 'load' olayı tetiklenmiyor mu? Ve görüntünün boyutları bir kez alınmaz mı? Belki de tarayıcının boyutlarını (CSS kurallarını da göz önünde bulundurarak) hesapladığından emin olmak için görüntüyü ihtiyaç duyduğunuz yere eklemeden önce viewport'un dışında görüntüleyebilirsiniz. Yeniden yükleme tamamlanmadan önce onload olayı tetiklendiğinden – Kiruse

cevap

-1

Pencere yükünün hile yapıp yapmayacağını görebilirsiniz.Yeni içerik yüklendiğinde veya birden fazla kez yüklendiğinden emin değilim.

ancak görüntüler için böyle bir şey kullanabilirsiniz.

// yükleme bitirdikten görüntüleri eşleşen sonra bir işlev çağrısı

function imagesLoadedEvent(selector, callback) { 
    var This = this; 
    this.images = $(selector); 
    this.nrImagesToLoad = this.images.length; 
    this.nrImagesLoaded = 0; 

    //check if images have already been cached and loaded 
    $.each(this.images, function (key, img) { 
     if (img.complete) { 
      This.nrImagesLoaded++; 
     } 
     if (This.nrImagesToLoad == This.nrImagesLoaded) { 
      callback(This.images); 
     } 
    }); 

    this.images.load(function (evt) { 
     This.nrImagesLoaded++; 
     if (This.nrImagesToLoad == This.nrImagesLoaded) { 
      callback(This.images); 
     } 
    }); 
} 

$("#btn").click(function() { 
    var c = $("#container"), evt; 
    c.empty(); 
    c.append("<img src='" + $("#img1").val() + "' width=94>"); 
    c.append("<img src='" + $("#img2").val() + "' width=94>"); 
    c.append("<img src='" + $("#img3").val() + "' width=94>"); 
    evt = new imagesLoadedEvent("img", allImagesLoaded); 
}); 

function allImagesLoaded(imgs) { 
    //this is called when all images are loaded 
    //console.log("all " + imgs.length + " images loaded"); 
} 

js fiddle for images loaded

+0

onload çalışmayacaktır. ayrıca, benim durumumda, içerik (resim içerebilir veya içermeyebilir), resimler değil, içeriktir. –

+0

Resim içermiyorsa, her biçimlendirme bloğunun en sonunda bir saydam/gizli/1px * 1px görüntü ekleyebilir, böylece eklenecek son şey ve image.load olayı her şeyden sonra tetiklenir yükleme bitti. Yukarıda belirtildiği gibi –

+0

, kaldırma işlemi tamamlanmadan önce kaldırma olayının patlaması nedeniyle boşaltma çalışmaz. (Ayrıca, bu durumda, içerik üzerinde zaten herhangi bir kontrole sahip değilim) –

İlgili konular