jQuery เหตุการณ์สำหรับรูปภาพที่โหลด


96

เป็นไปได้หรือไม่ที่จะตรวจจับเมื่อรูปภาพทั้งหมดถูกโหลดผ่านเหตุการณ์ jQuery

ตามหลักการแล้วควรมีไฟล์

$(document).idle(function()
{
}

หรือ

$(document).contentLoaded(function()
{
}

แต่ฉันไม่พบสิ่งนั้น

ฉันคิดว่าจะแนบเหตุการณ์เช่นนี้:

$(document).ready(function()
{
    var imageTotal = $('img').length;
    var imageCount = 0;        
    $('img').load(function(){if(++imageCount == imageTotal) doStuff();});
}

แต่จะพังหรือไม่หากโหลดรูปภาพไม่สำเร็จ การเรียกวิธีการนี้มีความสำคัญอย่างยิ่งและในเวลาที่เหมาะสม


9
ทำไมคุณไม่ใช้เหตุการณ์ onload: $ (window) .load (doStuff)? อย่างไรก็ตาม Onload จะรอทรัพยากรอื่น ๆ ด้วยเช่นกัน (เช่นสคริปต์สไตล์ชีตและแฟลช) ไม่ใช่แค่ภาพซึ่งคุณอาจจะพอใจหรือไม่ก็ได้
moff

การแนบเหตุการณ์การโหลดเข้ากับแท็ก img ทั้งหมดของคุณตามที่คุณมีในตัวอย่างโค้ดของคุณควรใช้งานได้ หากรูปภาพล้มเหลวในการโหลด doStuff () จะไม่ถูกเรียก แต่ดูเหมือนว่าสมเหตุสมผลตามความต้องการของคุณที่ต้องโหลดรูปภาพทั้งหมด
Steve Goodman

2
เมธอด. load () เลิกใช้งานแล้วตั้งแต่ jQuery 1.8 ตรวจสอบสิ่งนี้: stackoverflow.com/questions/3877027/…
fiorix

คำตอบ:


116

ตามเอกสารประกอบของ jQuery มีข้อควรระวังหลายประการสำหรับการใช้เหตุการณ์โหลดกับรูปภาพ ตามที่ระบุไว้ในคำตอบอื่นปลั๊กอิน ahpi.imgload.js ใช้งานไม่ได้ แต่ส่วนสำคัญของ Paul Irish ที่เชื่อมโยงจะไม่ได้รับการดูแลอีกต่อไป

ตาม Paul Irish ปลั๊กอิน Canonical สำหรับตรวจจับเหตุการณ์ที่สมบูรณ์ในการโหลดรูปภาพอยู่ที่:

https://github.com/desandro/imagesloaded


4
นี่คือคำตอบ - จัดการกับรูปภาพหลายภาพแคชรูปภาพที่แปลกประหลาดของเบราว์เซอร์รูปภาพที่เสียหายและเป็นปัจจุบัน สวย.
ญาริน

7
ทดสอบวันนี้ พร้อมใช้งานใน 2 นาที
CodeToad

เห็นด้วยกับ @Yarin เอกสารดีใช้งานง่ายหลายแคชเสียและเป็นปัจจุบัน รักมัน.
johntrepreneur

อย่างไรก็ตามในด้านลบ imagesLoaded ไม่รองรับ IE7หากสิ่งนั้นสำคัญสำหรับคุณ
johntrepreneur

1
รวดเร็วและง่ายในการแก้ไข 2 บรรทัดที่จะได้รับimagesLoaded ทำงานเกี่ยวกับ IE7
johntrepreneur

63

หากคุณต้องการตรวจสอบภาพไม่ใช่ทั้งหมด แต่เป็นภาพที่เฉพาะเจาะจง (เช่นภาพที่คุณแทนที่แบบไดนามิกหลังจาก DOM เสร็จสมบูรณ์แล้ว) คุณสามารถใช้สิ่งนี้:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  

70
โปรดใช้ความระมัดระวังเนื่องจากload()จะไม่ทำงานเมื่อโหลดรูปภาพแล้ว สิ่งนี้เกิดขึ้นได้ง่ายเมื่อรูปภาพอยู่ในแคชเบราว์เซอร์ของผู้ใช้ คุณตรวจสอบได้ว่ามีการโหลดรูปภาพแล้ว$('#myImage').prop('complete')หรือไม่ซึ่งจะคืนค่าจริงเมื่อโหลดรูปภาพ
Blaise

6
เหตุใดจึงมีการโหวตจำนวนมากเมื่อ a) ไม่ตอบคำถามของเขาและ b) ให้คำตอบที่ไม่ดีนอกจากนี้? (หมายถึงในขณะที่คำตอบที่ถูกต้องคือ @ johnpolacek และมี 1 โหวต)
Yarin

5
คำเตือน!!!!!!!!!!!!!!! นี่ไม่ใช่คำตอบที่ถูกต้อง johnpolacek มีคำตอบที่ถูกต้อง กรุณาโหวตคำตอบของเขา
mrbinky3000

4
การคัดค้านเหล่านี้ดูเหมือนจะไม่เกี่ยวข้องอีกต่อไปยกเว้นในกรณีที่เฉพาะเจาะจงมาก: Webkit เมื่อคุณเปลี่ยน src ของรูปภาพเป็น src เหมือนเดิมทุกประการ สำหรับรูปภาพที่คุณเพิ่งเพิ่มลงใน DOM $ (... ). load () ก็น่าจะเพียงพอแล้ว ทดสอบใน FF และ Chrome ปัจจุบันและ IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini

1
+1 ใช้งานได้ดีเมื่อ (คุณรู้ว่า) รูปภาพไม่ได้อยู่ในแคชของเบราว์เซอร์
Lode

28

คุณสามารถใช้ปลั๊กอินของฉันwaitForImagesเพื่อจัดการสิ่งนี้ ...

$(document).waitForImages(function() {
   // Loaded.
});

ข้อดีของสิ่งนี้คือคุณสามารถแปลเป็นองค์ประกอบบรรพบุรุษเดียวและสามารถเลือกที่จะตรวจจับภาพที่อ้างถึงใน CSS

นี่เป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็งโปรดตรวจสอบเอกสารสำหรับฟังก์ชันการทำงานเพิ่มเติม


สวัสดีอเล็กซ์ดูสดใส แต่เช่นเดียวกับที่กล่าวถึงในคำตอบและความคิดเห็นที่ได้รับจาก johnpolacek และ hirisov จะครอบคลุมกรณีที่รูปภาพอยู่ในแคชของเบราว์เซอร์แล้วหรือไม่?
SexyBeast

ฉันมีกระบวนการที่สร้างรูปภาพและโหลดแบบไดนามิกหลังจากที่โหลดเพจแล้วและฉันจำเป็นต้องแสดง ajax loader ในขณะที่ผู้ใช้รอ ปลั๊กอินนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับกรณีการใช้งานนั้น คุณต้องเรียกใช้ฟังก์ชันหลังจากตั้งค่าคุณสมบัติ img src อย่างไรก็ตาม!
John Livermore

20

ไม่รับประกันการใช้ jQuery $ (). load () เป็นตัวจัดการเหตุการณ์ IMG หากรูปภาพโหลดจากแคชเบราว์เซอร์บางตัวอาจไม่ปิดเหตุการณ์ ในกรณีของ Safari เวอร์ชัน (เก่ากว่า?) หากคุณเปลี่ยนคุณสมบัติ SRC ขององค์ประกอบ IMG เป็นค่าเดียวกันเหตุการณ์ onload จะไม่เริ่มทำงาน

ดูเหมือนว่าสิ่งนี้เป็นที่รู้จักใน jQuery ล่าสุด (1.4.x) - http://api.jquery.com/load-event - เพื่ออ้างอิง:

เป็นไปได้ว่าเหตุการณ์การโหลดจะไม่ถูกทริกเกอร์หากรูปภาพถูกโหลดจากแคชของเบราว์เซอร์ เพื่ออธิบายถึงความเป็นไปได้นี้เราสามารถใช้เหตุการณ์โหลดพิเศษที่จะเริ่มทำงานทันทีหากภาพพร้อม ปัจจุบัน event.special.load มีให้ใช้งานเป็นปลั๊กอิน

ตอนนี้มีปลั๊กอินสำหรับจดจำกรณีนี้และคุณสมบัติ "สมบูรณ์" ของ IE สำหรับสถานะโหลดองค์ประกอบ IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

ตามคำตอบนี้คุณสามารถใช้jQuery load eventบนwindowออบเจ็กต์แทนdocument:

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

สิ่งนี้จะถูกทริกเกอร์หลังจากโหลดเนื้อหาทั้งหมดในเพจแล้ว สิ่งนี้แตกต่างจากjQuery(document).load(...)ที่เกิดขึ้นหลังจากโหลด DOM เสร็จแล้ว


นี่คือสิ่งที่ฉันกำลังมองหา!
Eric K

4

imagesLoaded Plugin เป็นวิธีที่จะไปหากคุณต้องการโซลูชัน crossbrowser

 $("<img>", {src: 'image.jpg'}).imagesLoaded( function( $images, $proper, $broken ){
 if($broken.length > 0){
 //Error CallBack
 console.log('Error');
 }
 else{
 // Load CallBack
 console.log('Load');
 }
 });

หากคุณต้องการ IE WorkAround สิ่งนี้จะทำ

 var img = $("<img>", {
    error: function() {console.log('error'); },
    load: function() {console.log('load');}
    });
  img.attr('src','image.jpg');


2

สำหรับภาพต้นกำเนิดเดียวกันคุณสามารถใช้:

$.get('http://www.your_domain.com/image.jpg', imgLoaded);

function imgLoaded(){
    console.log(this, 'loaded');
}


0
  function CheckImageLoadingState()
  {
     var counter = 0;
     var length = 0;

     jQuery('#siteContent img').each(function() 
     {
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
          length++;
     });

     jQuery('#siteContent img').each(function() 
     {  
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
        {
           jQuery(this).load(function() 
           {
           }).each(function() {
              if(this.complete) jQuery(this).load();
            });
        }
        jQuery(this).load(function()
        {
           counter++;
           if(counter === length) 
           {  
              //function to call when all the images have been loaded
              DisplaySiteContent();
           }
        });
     });
  }


0

ฉันสร้างสคริปต์ของตัวเองเพราะฉันพบว่าปลั๊กอินจำนวนมากค่อนข้างบวมและฉันแค่อยากให้มันทำงานในแบบที่ฉันต้องการ เหมืองจะตรวจสอบว่าแต่ละภาพมีความสูงหรือไม่ (ความสูงของภาพดั้งเดิม) ฉันได้รวมมันเข้ากับฟังก์ชัน $ (window) .load () เพื่อแก้ไขปัญหาการแคช

ฉันเขียนโค้ดแสดงความคิดเห็นค่อนข้างหนักดังนั้นจึงควรดูแม้ว่าคุณจะไม่ได้ใช้ก็ตาม มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

โดยไม่ต้องกังวลใจอีกต่อไปนี่คือ:

สคริปต์ imgLoad.js


0

กำลังรอให้รูปภาพทั้งหมดโหลด ...
ฉันพบว่า anwser มีปัญหากับ jfriend00 ที่นี่jquery: จะฟังเหตุการณ์ที่โหลดรูปภาพของคอนเทนเนอร์หนึ่งไฟล์ได้อย่างไร .. และ "if (this.complete)"
กำลังรอให้ทุกสิ่งโหลดและบางส่วนอาจอยู่ในแคช! .. และฉันได้เพิ่มเหตุการณ์ "ข้อผิดพลาด" ... มันมีประสิทธิภาพในทุกเบราว์เซอร์

$(function() { // Wait dom ready
    var $img = $('img'), // images collection
        totalImg = $img.length,
        waitImgDone = function() {
            totalImg--;
            if (!totalImg) {
                console.log($img.length+" image(s) chargée(s) !");
            }
        };
    $img.each(function() {
        if (this.complete) waitImgDone(); // already here..
        else $(this).load(waitImgDone).error(waitImgDone); // completed...
    });
});

การสาธิต: http://jsfiddle.net/molokoloco/NWjDb/


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