Phát hiện xem trang đã tải xong chưa


91

Có cách nào để phát hiện khi một trang đã tải xong, tức là tất cả nội dung, javascript và các tài sản của nó như css và hình ảnh không?

như vậy:

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

và ngoài ra, nếu trang đã tải hơn 1 phút thì hãy làm điều gì đó khác như:

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

Tôi đã thấy các trang web như MobileMe của Apple thực hiện kiểm tra tương tự nhưng không thể tìm ra nó trong thư viện mã khổng lồ của họ.

Có ai giúp được không?

Cảm ơn

CHỈNH SỬA: Về cơ bản đây là những gì tôi muốn làm:

// 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
Có lý do gì mà window.onload(hoặc $(window).load()) không hoạt động?
sdleihssirhc

Chào bạn @Cameron. Mã nào hoạt động để ẩn trình tải sau khi trang tải xong?
tnkh

@TonyNg Xem câu trả lời của tôi: stackoverflow.com/questions/7083693/...
Cameron

Câu trả lời:


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

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

});

Hoặc http://jsfiddle.net/tfinityJ/fLLrs/1/

Xem thêm http://api.jquery.com/load-event/ để biết giải thích về jQuery (window) .load.

Cập nhật

Bạn có thể tìm thấy giải thích chi tiết về cách tải javascript và hai sự kiện DOMContentLoadedOnLoad trên trang này .

DOMContentLoaded : Khi DOM sẵn sàng được thao tác. Cách jQuery nắm bắt sự kiện này là với jQuery(document).ready(function () {});.

OnLoad : Khi DOM đã sẵn sàng và tất cả nội dung - bao gồm hình ảnh, iframe, phông chữ, v.v. - đã được tải và lớp bánh xe quay / giờ biến mất. Cách jQuery nắm bắt sự kiện này đã được đề cập ở trên jQuery(window).load.


Nếu bạn nhìn vào OP của tôi, tôi đã sửa đổi nó để nó cho thấy mục tiêu của tôi là gì. Vì vậy, về cơ bản tôi muốn hiển thị trang sau khi tất cả nội dung đã tải và làm mờ dần trình tải và mờ dần trong nội dung. Mã của tôi có hoạt động chính xác không? Chúc mừng
Cameron

Mã của bạn trông ổn nhưng tôi phải xem nó hoạt động để chắc chắn.
TJ.

@Jimmer Có: MDN : "Sự kiện tải được kích hoạt khi tài nguyên và các tài nguyên phụ thuộc của nó đã tải xong."
TJ.

2
Xin lưu ý rằng tính năng jQuery.load()này không được dùng nữa kể từ jQuery / 1.8 và bị loại bỏ trong jQuery / 3. Cú pháp hiện tại là jQuery(window).on("load", function(){/*...*/});.
Álvaro González

58

có hai cách để thực hiện việc này trong jquery tùy thuộc vào những gì bạn đang tìm kiếm ..

sử dụng jquery bạn có thể làm

  • // điều này sẽ đợi nội dung văn bản được tải trước khi gọi điều này (dom .. css .. js)

    $(document).ready(function(){...});
  • // điều này sẽ đợi tất cả hình ảnh và nội dung văn bản tải xong trước khi thực thi

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

Trong phương pháp này, làm thế nào bạn có thể biết nếu trang đã tải trong vài phút nhưng vẫn chưa hoàn tất?
yoozer8

2
điều này có thể được thực hiện bằng setTimeout (function () {! loading && foo ();}, 20000); và thiết lập nạp vào đúng trong doc sẵn sàng hoặc cửa sổ tải
samccone

1
đối với jquery 3.0 sử dụng $ (window) .on ("load", function (e) {});
08

13

Đó được gọi là onload. DOM sẵn sàng thực sự đã được tạo ra vì lý do chính xác là tải lên chờ hình ảnh. (Câu trả lời được lấy từ Matchu cho một câu hỏi tương tự cách đây không lâu.)

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

onload đợi tất cả các tài nguyên là một phần của tài liệu.

Liên kết đến một câu hỏi mà anh ấy đã giải thích tất cả:

Nhấp vào tôi, bạn biết bạn muốn!


10

Tôi nghĩ cách dễ nhất sẽ là

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

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

CHỈNH SỬA, để có một chút điên rồ:

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

Tôi giống như ý tưởng này TUY NHIÊN itemslen bao giờ có vẻ để đếm ngược tới 0.
Cấm

1
CẨN THẬN VỀ PHƯƠNG PHÁP NÀY - Nó giả định rằng tất cả các phần tử được liệt kê đều có sự kiện 'tải', điều mà nhiều phần tử trong ví dụ này không xảy ra.
John Wedgbury

6

Một tùy chọn khác mà bạn có thể kiểm tra tài liệu .readyState như,

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

Từ tài liệu của Trang readyState, tóm tắt về trạng thái hoàn chỉnh là

Trả về "đang tải" trong khi tài liệu đang tải, "tương tác" sau khi hoàn thành phân tích cú pháp nhưng vẫn tải tài nguyên phụ và "hoàn tất" khi tài liệu đã tải.


Tôi đã gặp sự cố với hình ảnh được lưu trong bộ nhớ cache và đây có vẻ là mã tốt hơn cho điều đó trong hiệu suất ... Bạn đang thắc mắc về thực hành? Có vẻ tốt hơn jQuery $(window).on("load" function () {//dostuff})...?
kmkmkm

3

Một tùy chọn là để trang trống, chứa một lượng nhỏ javascript. Sử dụng tập lệnh để thực hiện cuộc gọi AJAX để lấy nội dung trang thực và có hàm thành công ghi kết quả lên tài liệu hiện tại. Trong chức năng thời gian chờ, bạn có thể "làm điều gì đó tuyệt vời khác"

Mã giả gần đúng:

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

Vâng, đúng vậy. Nhưng đó là cách đầu tiên tôi nghĩ đến khi tôi tự hỏi bản thân "Làm cách nào để một trang có thể biết được yêu cầu đó đã hết thời gian chưa?"
yoozer

tốt nó sẽ không cho bạn biết nếu những hình ảnh có thành loading .. thay vì nó sẽ chỉ nói nếu đánh dấu liệu đã được tải
samccone

Hừm. Dẫn tôi đến một câu hỏi thú vị. Nếu bạn vừa thực hiện $ (document) .html (response) và phản hồi chứa document.ready hoặc window.load, thì điều đó có thực thi sau khi tài liệu được viết không? Hay trình duyệt sẽ thấy trang như đã được tải và không gọi chúng khi nội dung thay đổi?
yoozer

tôi nghĩ rằng nó sẽ gọi nó là một lần thứ hai nhưng không phải 100% ... thử nó ra
samccone

2

Đây có phải là những gì bạn có trong tâm trí?

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

1
Điều này sẽ chạy khi DOM đã sẵn sàng, nhưng đó có thể là trước khi những thứ như hình ảnh tải xong.
James Allardice


2

Nếu không có jquery hoặc bất cứ điều gì tương tự như vậy thì tại sao không?

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

Điều này đúng, nhưng hơi khác so với những gì jquerythực hiện. DOMContentLoadedchỉ được kích hoạt sau khi nội dung bên ngoài được tải (đặc biệt là hình ảnh, có thể mất nhiều thời gian trong một số điều kiện nhất định). jquerythực hiện .ready()bằng cách sử dụng các sự kiện cụ thể của trình duyệt, sự kiện này (trên hầu hết các trình duyệt) xảy ra trước khi nội dung bên ngoài được tải.
Grochmal

1

FYI của những người đã hỏi trong các nhận xét, đây là những gì tôi thực sự sử dụng trong các dự án:

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');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.