Czy istnieje sposób na wykrycie zakończenia ładowania strony, tj. Całej jej zawartości, kodu JavaScript i zasobów, takich jak css i obrazy?
tak jak:
if(PAGE HAS FINISHED LOADING)
{
// do something amazing
}
a także dodatkowo, jeśli strona ładowała się dłużej niż 1 minutę, zrób coś innego, na przykład:
if(PAGE HAS BEEN LOADING FOR 1 MIN)
{
// do something else amazing
}
Widziałem witryny internetowe, takie jak MobileMe firmy Apple, przeprowadzające podobne kontrole, ale nie byłem w stanie tego rozgryźć w ich ogromnych bibliotekach kodu.
Czy ktoś może pomóc?
Dzięki
EDYCJA: Zasadniczo chcę to zrobić:
// 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);
});
window.onload
(lub$(window).load()
) nie zadziała?Odpowiedzi:
jQuery(window).load(function () { alert('page is loaded'); setTimeout(function () { alert('page is loaded and 1 minute has passed'); }, 60000); });
Lub http://jsfiddle.net/tangibleJ/fLLrs/1/
Zobacz także http://api.jquery.com/load-event/, aby uzyskać wyjaśnienie dotyczące jQuery (okno) .load.
Aktualizacja
Szczegółowe wyjaśnienie, jak działa ładowanie javascript oraz dwa zdarzenia DOMContentLoaded i OnLoad, można znaleźć na tej stronie .
DOMContentLoaded : kiedy DOM jest gotowy do manipulacji. Metoda jQuery na przechwytywanie tego zdarzenia polega na
jQuery(document).ready(function () {});
.OnLoad : gdy DOM jest gotowy i wszystkie zasoby - w tym obrazy, elementy iframe, czcionki itp. - zostały załadowane, a obracające się koło / klasa godzin znikają. Sposób, w jaki jQuery przechwytuje to wydarzenie, jest wspomniany powyżej
jQuery(window).load
.źródło
jQuery.load()
zostało to przestarzałe od wersji jQuery / 1.8 i usunięte w jQuery / 3. Obecna składnia tojQuery(window).on("load", function(){/*...*/});
.w jquery można to zrobić na dwa sposoby, w zależności od tego, czego szukasz.
używając jquery, możesz to zrobić
// to będzie czekać na załadowanie zasobów tekstowych przed wywołaniem this (dom .. css .. js)
$(document).ready(function(){...});
// to będzie czekać na zakończenie ładowania wszystkich obrazów i zasobów tekstowych przed wykonaniem
$(window).load(function(){...});
źródło
To się nazywa onload. Gotowy model DOM został stworzony dokładnie z tego powodu, że ładowanie czekało na obrazy. (Odpowiedź pochodzi z Matchu na podobne pytanie jakiś czas temu.)
window.onload = function () { alert("It's loaded!") }
onload czeka na wszystkie zasoby, które są częścią dokumentu.
Link do pytania, w którym wszystko wyjaśnił:
Kliknij mnie, wiesz, że chcesz!
źródło
Myślę, że najłatwiej byłoby
var items = $('img, style, ...'), itemslen = items.length; items.bind('load', function(){ itemslen--; if (!itemlen) // Do stuff here });
EDYTUJ, żeby być trochę szalonym:
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 });
źródło
Inną opcją możesz sprawdzić dokument. ReadyState like,
var chkReadyState = setInterval(function() { if (document.readyState == "complete") { // clear the interval clearInterval(chkReadyState); // finally your page is loaded. } }, 100);
Z dokumentacji strony readyState podsumowanie kompletnego stanu to
źródło
$(window).on("load" function () {//dostuff})
...?Jedną z opcji jest pozostawienie pustej strony, zawierającej niewielką ilość kodu JavaScript. Użyj skryptu, aby wykonać wywołanie AJAX w celu uzyskania rzeczywistej zawartości strony, a funkcja sukcesu zapisze wynik w bieżącym dokumencie. W funkcji timeout możesz „zrobić coś jeszcze niesamowitego”
Przybliżony pseudokod:
$(document).ready(function(){ $.ajax url of actual page success:do something amazing timeout: do something else });
źródło
Czy to właśnie miałeś na myśli?
$("document").ready( function() { // do your stuff }
źródło
var pageLoaded=0; $(document).ready(function(){ pageLoaded=1; });
Korzystanie z jquery: https://learn.jquery.com/using-jquery-core/document-ready/
źródło
Bez jQuery lub czegoś podobnego, bo czemu nie?
var loaded=0; var loaded1min=0; document.addEventListener("DOMContentLoaded", function(event) { loaded=1; setTimeout(function () { loaded1min=1; }, 60000); });
źródło
jquery
działa.DOMContentLoaded
jest uruchamiany dopiero po załadowaniu zawartości zewnętrznej (zwłaszcza obrazów, co może zająć dużo czasu w określonych warunkach).jquery
wykonuje.ready()
za pomocą zdarzeń specyficznych dla przeglądarki, które (w większości przeglądarek) mają miejsce przed załadowaniem zawartości zewnętrznej.FYI osób, które pytały w komentarzach, właśnie tego użyłem w projektach:
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'); });
źródło