ตรวจสอบว่าหน้าโหลดเสร็จหรือไม่


93

มีวิธีตรวจสอบเมื่อหน้าโหลดเสร็จแล้วเช่นเนื้อหาจาวาสคริปต์และเนื้อหาทั้งหมดเช่น css และรูปภาพ

ชอบมาก:

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

และนอกจากนี้หากหน้าเว็บโหลดนานกว่า 1 นาทีให้ทำอย่างอื่นเช่น:

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

ฉันเคยเห็นเว็บไซต์เช่น MobileMe ของ Apple ทำการตรวจสอบที่คล้ายกัน แต่ไม่สามารถหาได้ในไลบรารีรหัสขนาดใหญ่

ใครสามารถช่วย?

ขอบคุณ

แก้ไข: นี่คือสิ่งที่ฉันต้องการทำโดยพื้นฐาน:

// 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

สวัสดี @Cameron รหัสใดใช้ซ่อนตัวโหลดหลังจากโหลดหน้าเสร็จแล้ว
tnkh

@TonyNg ดูคำตอบของฉัน: stackoverflow.com/questions/7083693/…
Cameron

คำตอบ:


129
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 (หน้าต่าง) .load

อัปเดต

คำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงานของการโหลดจาวาสคริปต์และDOMContentLoadedและOnLoadสองเหตุการณ์ในหน้านี้

DOMContentLoaded : เมื่อDOM พร้อมที่จะจัดการ วิธีของ jQuery jQuery(document).ready(function () {});ในการจับภาพเหตุการณ์นี้ด้วย

OnLoad : เมื่อDOM พร้อมและเนื้อหาทั้งหมดซึ่งรวมถึงรูปภาพ iframe แบบอักษรและอื่น ๆได้ถูกโหลดและคลาสล้อหมุน / ชั่วโมงจะหายไป วิธีของ jQuery jQuery(window).loadในการจับภาพเหตุการณ์นี้เป็นดังกล่าวข้างต้น


หากคุณดู OP ของฉันฉันได้แก้ไขเพื่อให้แสดงว่าเป้าหมายของฉันคืออะไร โดยพื้นฐานแล้วฉันต้องการแสดงหน้าเว็บหลังจากที่เนื้อหาทั้งหมดโหลดและลบตัวโหลดออกและทำให้เนื้อหาจางลง รหัสของฉันทำงานถูกต้องหรือไม่ Cheers
Cameron

รหัสของคุณดูเรียบร้อย แต่ฉันต้องเห็นการใช้งานจริงเพื่อความแน่ใจ
T. Junghans

@ จิมเมอร์ใช่: MDN : "เหตุการณ์การโหลดจะเริ่มทำงานเมื่อรีซอร์สและรีซอร์สที่เกี่ยวข้องเสร็จสิ้นการโหลด"
T. Junghans

2
โปรดทราบว่าjQuery.load()เลิกใช้แล้วตั้งแต่ jQuery / 1.8 และลบออกใน jQuery / 3 ไวยากรณ์ปัจจุบันคือjQuery(window).on("load", function(){/*...*/});.
ÁlvaroGonzález

59

มีสองวิธีในการทำสิ่งนี้ใน jquery ขึ้นอยู่กับสิ่งที่คุณกำลังมองหา ..

โดยใช้ jquery คุณสามารถทำได้

  • // สิ่งนี้จะรอให้เนื้อหาข้อความโหลดก่อนที่จะเรียกสิ่งนี้ (dom .. css .. js)

    $(document).ready(function(){...});
    
  • // สิ่งนี้จะรอให้รูปภาพและเนื้อหาทั้งหมดโหลดเสร็จก่อนที่จะดำเนินการ

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

ด้วยวิธีนี้คุณจะทราบได้อย่างไรว่าหน้าเว็บโหลดมาหลายนาทีแล้วแต่ยังไม่เสร็จสมบูรณ์
yoozer8

2
ซึ่งสามารถทำได้ด้วย setTimeout (ฟังก์ชัน () {! loaded && foo ();}, 20000); และตั้งค่าให้โหลดเป็น true ใน doc ready หรือ window load
samccone

1
สำหรับ jquery 3.0 ให้ใช้ $ (window) .on ("load", function (e) {});
zero8

13

ที่เรียกว่า onload DOM ready ถูกสร้างขึ้นจริงด้วยเหตุผลที่แน่นอนว่า 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
});

ฉันชอบความคิดนี้ยังไงก็ตามรายการต่างๆดูเหมือนจะไม่นับถอยหลังถึง 0 เลย
ห้าม

1
ระวังวิธีนี้ - ถือว่าองค์ประกอบทั้งหมดที่ระบุมีเหตุการณ์ 'โหลด' ซึ่งหลายรายการในตัวอย่างไม่มี
John Wedgbury

6

อีกทางเลือกหนึ่งที่คุณสามารถตรวจสอบdocument.readyStateเช่น

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

จากเอกสารของหน้า readyState สรุปสถานะที่สมบูรณ์คือ

ส่งคืน "กำลังโหลด" ในขณะที่เอกสารกำลังโหลด "โต้ตอบ" เมื่อเสร็จสิ้นการแยกวิเคราะห์ แต่ยังคงโหลดทรัพยากรย่อยและ "เสร็จสมบูรณ์" เมื่อโหลดเสร็จ


ฉันมีปัญหากับรูปภาพแคชและดูเหมือนว่านี่จะเป็นรหัสที่ดีกว่าสำหรับประสิทธิภาพนั้น ... สงสัยเกี่ยวกับการปฏิบัติ น่าจะดีกว่า jQuery $(window).on("load" function () {//dostuff})... ?
kmkmkm

3

ทางเลือกหนึ่งคือกำหนดให้หน้าว่างโดยมีจาวาสคริปต์จำนวนเล็กน้อย ใช้สคริปต์เพื่อทำการเรียก AJAX เพื่อรับเนื้อหาของเพจจริงและให้ฟังก์ชันสำเร็จเขียนผลลัพธ์บนเอกสารปัจจุบัน ในฟังก์ชันการหมดเวลาคุณสามารถ "ทำอย่างอื่นที่น่าทึ่ง"

pseudocode โดยประมาณ:

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

ใช่แล้ว. แต่เป็นวิธีแรกที่นึกขึ้นได้เมื่อถามตัวเองว่า "หน้าจะบอกได้อย่างไรว่าคำขอหมดเวลา"
yoozer8

จะไม่บอกคุณว่าภาพโหลดเสร็จแล้วหรือยัง .. แต่จะบอกว่าโหลดมาร์กอัปดิบแล้วเท่านั้น
samccone

หืม นำฉันไปสู่คำถามที่น่าสนใจ ถ้าคุณเพิ่งทำ $ (document) .html (response) และการตอบกลับมี document.ready หรือ window.load จะดำเนินการเมื่อเขียนเอกสารหรือไม่ หรือเบราว์เซอร์จะเห็นหน้าที่โหลดแล้วและไม่เรียกพวกเขาในเนื้อหาเปลี่ยนแปลงหรือไม่
yoozer8

ฉันคิดว่ามันจะเรียกมันเป็นครั้งที่สอง แต่ไม่ใช่ 100% ... ลองดูสิ
samccone

2

นี่คือสิ่งที่คุณคิดหรือไม่?

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

1
สิ่งนี้จะทำงานเมื่อ DOM พร้อม แต่อาจเกิดขึ้นก่อนที่สิ่งต่างๆเช่นรูปภาพจะโหลดเสร็จ
James Allardice


2

ไม่มี jquery หรืออะไรทำนองนั้นทำไมไม่?

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

1
สิ่งนี้ถูกต้อง แต่แตกต่างจากที่jqueryทำอยู่เล็กน้อย DOMContentLoadedจะถูกทริกเกอร์หลังจากโหลดเนื้อหาภายนอกแล้วเท่านั้น (โดยเฉพาะรูปภาพซึ่งอาจใช้เวลานานในบางเงื่อนไข) jqueryดำเนินการ.ready()โดยใช้เหตุการณ์เฉพาะของเบราว์เซอร์ซึ่ง (ในเบราว์เซอร์ส่วนใหญ่) เกิดขึ้นก่อนที่เนื้อหาภายนอกจะโหลด
grochmal

1

FYI ของคนที่ถามในความคิดเห็นนี่คือสิ่งที่ฉันใช้จริงในโครงการ:

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');
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.