检测页面是否已完成加载


91

有没有一种方法可以检测页面何时完成加载,即页面的所有内容,javascript和诸如CSS和图像之类的资产?

像这样:

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

另外,如果页面已加载超过1分钟,则执行其他操作,例如:

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

我见过像Apple的MobileMe这样的网站也进行了类似的检查,但无法在庞大的代码库中弄清楚。

有人可以帮忙吗?

谢谢

编辑:这实际上是我想做的:

// 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(或$(window).load())无效的原因?
sdleihssirhc 2011年

嗨@Cameron。页面加载完成后,哪个代码可以隐藏加载器?
tnkh

@TonyNg看到我的回答是:stackoverflow.com/questions/7083693/...
卡梅伦

Answers:


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

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

});

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

另请参阅http://api.jquery.com/load-event/以获取有关jQuery(window).load的说明。

更新资料

页面上可以找到有关javascript加载方式以及DOMContentLoadedOnLoad这两个事件的详细说明。

DOMContentLoaded准备操作DOM时。jQuery捕获此事件的方法是使用jQuery(document).ready(function () {});

OnLoad:当DOM准备就绪并且所有资源(包括图像,iframe,字体等)都已加载并且纺车/小时类消失时。上面提到的jQuery捕获此事件的方式jQuery(window).load


如果您查看我的OP,我已经对其进行了修改,以显示我的目标。因此,从本质上讲,我想在所有资产均已加载并淡出加载器并淡入内容后显示页面。我的代码能正常工作吗?欢呼声
卡梅隆,

您的代码看起来不错,但是我必须确保实际运行。
TJ。

@Jimmer是: MDN“当资源及其从属资源完成加载时,将触发加载事件。”
TJ。

2
请注意,jQuery.load()自jQuery / 1.8起已弃用,并已在jQuery / 3中删除。当前语法为jQuery(window).on("load", function(){/*...*/});
阿尔瓦罗·冈萨雷斯

58

有两种方法可以在jquery中执行此操作,具体取决于您要查找的内容。

使用jQuery你可以做

  • //这将等待文本资源加载,然后再调用它(dom..css..js)

    $(document).ready(function(){...});
  • //这将等待所有图像和文本资产完成加载,然后再执行

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

用这种方法,如何判断页面是否已经加载了几分钟但还没有完成?
yoozer8 2011年

2
这可以通过setTimeout(function(){!loaded && foo();},20000);完成。并在文档就绪或窗口加载
中将

1
对于jquery 3.0,请使用$(window).on(“ load”,function(e){});
zero8”,2009年

13

这就是所谓的onload。真正准备好DOM的原因是onload等待图像的确切原因。(前不久Matchu回答了一个类似的问题。)

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

onload等待文档中的所有资源。

链接到他解释了所有问题的问题:

点击我,你知道你想!


10

我认为最简单的方法是

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

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

编辑,有点疯狂:

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
});

我有点喜欢这个想法,但是itemlen似乎从来没有倒数到0。–
禁止

1
注意此方法-假定所有列出的元素都有一个“加载”事件,示例中的许多元素都没有。
John Wedgbury '18年

6

您可以检查document.readyState的另一个选项,例如

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

从readyState页面的文档中,完整状态的摘要为

文档加载时返回“ loading”,解析完成后返回“ interactive”,但仍加载子资源,加载后返回“ complete”。


我一直在缓存图片时遇到问题,这似乎是性能上更好的代码...想知道实践吗?似乎比jQuery更好$(window).on("load" function () {//dostuff})...?
kmkmkm

3

一种选择是使页面为空白,其中包含少量的javascript。使用脚本进行AJAX调用以获取实际的页面内容,并使成功函数将结果写入当前文档。在超时功能中,您可以“做其他令人惊奇的事情”

近似伪代码:

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

是的。但这是我问自己“页面如何判断请求是否超时?”时想到的第一种方法。
yoozer8'8

好吧,它不会告诉您图像是否已完成加载..而是只会说原始标记是否已加载
samccone 2011年

嗯 带我一个有趣的问题。如果您只是执行$(document).html(response),并且响应中包含document.ready或window.load,那么一旦写入文档,该命令便会执行吗?还是浏览器将页面视为已加载,而不在内容更改时调用它们?
yoozer8'8

我认为它将第二次调用它,但不是100%...试试吧
samccone 2011年

2

这就是您的想法吗?

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

1
该操作将在DOM准备就绪时运行,但是可以在图像加载完成之前进行。
2011年


2

没有jquery或类似的东西,为什么不呢?

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

这是正确的,但与jquery执行的操作略有不同。 DOMContentLoaded仅在加载外部内容(尤其是图像,在某些情况下可能需要很长时间)后才触发。 使用特定于浏览器的事件jquery执行.ready(),该事件(在大多数浏览器上)在加载外部内容之前发生。
grochmal

1

仅供参考,在评论中提出要求的人,这是我在项目中实际使用的:

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');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.