Sayfanın yüklenmesinin bitip bitmediğini tespit edin


92

Bir sayfanın ne zaman yüklenmesinin bittiğini, yani tüm içeriğini, javascript'i ve css ve görüntüleri gibi varlıkları tespit etmenin bir yolu var mı?

şöyle:

if(PAGE HAS FINISHED LOADING)
{
// do something amazing
}

ve ayrıca sayfa 1 dakikadan uzun süredir yükleniyorsa, aşağıdaki gibi başka bir şey yapın:

if(PAGE HAS BEEN LOADING FOR 1 MIN)
{
// do something else amazing
}

Apple'ın MobileMe'si gibi web sitelerinin benzer kontroller yaptığını gördüm, ancak büyük kod kitaplıklarında bunu çözemedim.

Biri yardım edebilir mi?

Teşekkürler

DÜZENLEME: Aslında yapmak istediğim şey bu:

// hide content
$("#hide").hide();

// hide loading
$("#loading").hide();

// fade in loading animation
setTimeout($('#loading').fadeIn(), 200);

jQuery(window).load(function() {
  $("#hide").fadeIn();

  $("#loading").fadeOut(function() {
    $(this).remove();
    clearInterval(loadingAnim);
  });

  setTimeout(function() {
    $("#error").fadeIn();
  }, 60000);
});

2
window.onload(Veya $(window).load()) işe yaramayacak bir sebep var mı ?
sdleihssirhc

Merhaba @Cameron. Sayfanın yüklenmesi tamamlandıktan sonra yükleyiciyi gizlemek için hangi kod çalışır?
tnkh

@TonyNg Cevabımı görün: stackoverflow.com/questions/7083693/…
Cameron

Yanıtlar:


128
jQuery(window).load(function () {
    alert('page is loaded');

    setTimeout(function () {
        alert('page is loaded and 1 minute has passed');   
    }, 60000);

});

Veya http://jsfiddle.net/tangibleJ/fLLrs/1/

Ayrıca bkz http://api.jquery.com/load-event/ jQuery (pencere) .Load üzerinde bir açıklama için.

Güncelleme

Nasıl javascript yükleme işlerinde ve iki olay üzerine ayrıntılı bir açıklama DOMContentLoaded ve OnLoad bulunabilir bu sayfada .

DOMContentLoaded : DOM değiştirilmeye hazır olduğunda. jQuery'nin bu olayı yakalama yolu ile jQuery(document).ready(function () {});.

OnLoad : DOM hazır olduğunda ve tüm varlıklar - buna resimler, iframe, yazı tipleri vb. Dahil - yüklendiğinde ve dönen tekerlek / saat sınıfı kaybolduğunda. jQuery'nin bu olayı yakalama yolu yukarıda belirtilmiştir jQuery(window).load.


OP'me bakarsanız, hedeflerimin ne olduğunu göstermesi için onu değiştirdim. Bu nedenle, esasen tüm varlıklar yüklendikten ve bir yükleyiciyi kapattıktan ve içerikte kaybolduktan sonra sayfayı göstermek istiyorum. Kodum doğru çalışır mı? Şerefe
Cameron

Kodunuz iyi görünüyor ancak emin olmak için onu çalışırken görmem gerekir.
T.Junghans

@Jimmer Evet: MDN : "Bir kaynak ve ona bağlı kaynaklar yüklemeyi bitirdiğinde yükleme olayı tetiklenir."
T.Junghans

2
Lütfen jQuery.load()jQuery / 1.8'den beri kullanımdan kaldırıldığını ve jQuery / 3'te kaldırıldığını unutmayın . Güncel sözdizimi jQuery(window).on("load", function(){/*...*/});.
Álvaro González

59

jQuery'de ne aradığınıza bağlı olarak bunu yapmanın iki yolu vardır ..

jquery kullanarak yapabilirsin

  • // bu, bunu çağırmadan önce metin varlıklarının yüklenmesini bekleyecek (dom .. css .. js)

    $(document).ready(function(){...});
    
  • // bu, çalıştırılmadan önce tüm resimlerin ve metin varlıklarının yüklemesinin bitmesini bekleyecektir

    $(window).load(function(){...});
    

Bu yöntemde, sayfanın birkaç dakikadır yüklenip yüklenmediğini ancak henüz tamamlanmadığını nasıl anlarsınız?
yoozer8

2
bu bir setTimeout (function () {! yüklendi && foo ();}, 20000); ve dokümana hazır veya pencere yüklemesinde doğru olarak ayarlandı
samccone

1
jquery 3.0 için $ (window) .on ("load", function (e) {}) kullanın;
zero8

13

Buna yüklenme denir. DOM ready, aslında onload işleminin görüntülerde beklemesinin tam nedeni için oluşturuldu. ( Matchu'dan bir süre önce benzer bir soru üzerine alınan cevap .)

window.onload = function () { alert("It's loaded!") }

onload, belgenin parçası olan tüm kaynakları bekler.

Her şeyi açıkladığı bir soruya bağlantı verin:

Beni tıkla, istediğini biliyorsun!


10

Bence en kolay yol

var items = $('img, style, ...'), itemslen = items.length;

items.bind('load', function(){ 
    itemslen--;
    if (!itemlen) // Do stuff here
});

Biraz çılgın olmak için DÜZENLE:

var items = $('a, abbr, acronym, address, applet, area, audio, b, base, ' + 
    'basefont, bdo, bgsound, big, body, blockquote, br, button, canvas, ' + 
    'caption, center, cite, code, col, colgroup, comment, custom, dd, del, ' +
    'dfn, dir, div, dl, document, dt, em, embed, fieldset, font, form, frame, ' +
    'frameset, head, hn, hr, html, i, iframe, img, input, ins, isindex, kbd, ' +
    'label, legend, li, link, listing, map, marquee, media, menu, meta, ' +
    'nextid, nobr, noframes, noscript, object, ol, optgroup, option, p, ' +
    'param, plaintext, pre, q, rt, ruby, s, samp, script, select, small, ' + 
    'source, span, strike, strong, style, sub, sup, table, tbody, td, ' + 
    'textarea, tfoot, th, thead, title, tr, tt, u, ul, var, wbr, video, ' + 
    'window, xmp'), itemslen = items.length;

items.bind('load', function(){ 
    itemslen--;
    if (!itemlen) // Do stuff here
});

Bu fikir hoşuma gitti HOWEVER itemslen asla 0'a geri saymıyor gibi görünüyor.
yasaklanıyor

1
BU YÖNTEME DİKKAT EDİN - Listelenen tüm öğelerin, örnekte birçoğunun sahip olmadığı bir 'yük' olayına sahip olduğunu varsayar.
John Wedgbury

6

Document.readyState gibi kontrol edebileceğiniz başka bir seçenek ,

var chkReadyState = setInterval(function() {
    if (document.readyState == "complete") {
        // clear the interval
        clearInterval(chkReadyState);
        // finally your page is loaded.
    }
}, 100);

ReadyState Sayfasının belgelerinden tam durumun özeti şu şekildedir:

Belge yüklenirken "yükleniyor", ayrıştırma tamamlandığında ancak alt kaynakları yüklemeye devam ettiğinde "etkileşimli" ve yüklendikten sonra "tamamlandı" döndürür.


Önbelleğe alınmış görüntülerle ilgili sorunlar yaşıyorum ve bu, performansta bunun için daha iyi bir kod gibi görünüyor ... Pratik yapmayı mı merak ediyorsunuz? JQuery'den daha iyi görünüyor $(window).on("load" function () {//dostuff})...?
kmkmkm

3

Bir seçenek, sayfanın az miktarda javascript içeren boş bırakılmasıdır. Gerçek sayfa içeriğini almak için bir AJAX çağrısı yapmak için komut dosyasını kullanın ve başarı işlevinin sonucu geçerli belgenin üzerine yazmasını sağlayın. Zaman aşımı işlevinde "harika başka bir şey yapabilirsiniz"

Yaklaşık sözde kod:

$(document).ready(function(){
    $.ajax
      url of actual page
      success:do something amazing
      timeout: do something else
});

Evet öyle. Ama kendime "Bir sayfa, bir isteğin zaman aşımına uğradığını nasıl anlar?" Diye sorduğumda aklıma gelen ilk yol buydu.
yoozer8

resimlerin yüklemesinin bitip bitmediğini size söylemeyecek .. bunun yerine sadece ham işaretlemenin yüklenip yüklenmediğini
gösterecektir

Hm. Beni ilginç bir soruya yönlendiriyor. Az önce $ (document) .html (yanıt) yaptıysanız ve yanıt bir document.ready veya bir window.load içeriyorsa, belge yazıldıktan sonra bu çalıştırılır mı? Ya da tarayıcı sayfayı önceden yüklenmiş olarak görür ve içerik değişikliğinde çağırmaz mı?
yoozer8

sanırım ikinci kez arayacak ama% 100 değil ... deneyin
samccone

2

Aklından geçen bu muydu?

$("document").ready( function() {
    // do your stuff
}

1
Bu, DOM hazır olduğunda çalışır, ancak bu, resimler gibi şeylerin yüklenmesi bitmeden önce olabilir.
James Allardice


2

Jquery veya bunun gibi bir şey olmadan neden olmasın?

var loaded=0;
var loaded1min=0;
document.addEventListener("DOMContentLoaded", function(event) {
   loaded=1;
    setTimeout(function () {
      loaded1min=1;
    }, 60000);
});

Bu doğru, ancak jqueryperformans gösterenden biraz farklı . DOMContentLoadedyalnızca harici içerik yüklendikten sonra tetiklenir (özellikle belirli koşullarda uzun sürebilen görüntüler). (çoğu tarayıcıda) harici içerik yüklenmeden önce jquerygerçekleşen .ready()tarayıcıya özgü olayları kullanarak gerçekleştirir .
grochmal

1

Bilginize, yorumlarda soran insanların, aslında projelerde kullandığım şey:

function onLoad(loading, loaded) {
    if(document.readyState === 'complete'){
        return loaded();
    }
    loading();
    if (window.addEventListener) {
        window.addEventListener('load', loaded, false);
    }
    else if (window.attachEvent) {
        window.attachEvent('onload', loaded);
    }
};

onLoad(function(){
   console.log('I am waiting for the page to be loaded');
},
function(){
    console.log('The page is loaded');
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.