image.onload เหตุการณ์และแคชของเบราว์เซอร์


114

ฉันต้องการสร้างกล่องแจ้งเตือนหลังจากโหลดรูปภาพแล้ว แต่หากรูปภาพถูกบันทึกไว้ในแคชของเบราว์เซอร์.onloadเหตุการณ์จะไม่เริ่มทำงาน

ฉันจะแจ้งเตือนได้อย่างไรเมื่อรูปภาพถูกโหลดไม่ว่ารูปภาพนั้นจะถูกแคชหรือไม่ก็ตาม

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

คำตอบ:


157

ในขณะที่คุณสร้างภาพแบบไดนามิกให้ตั้งค่าonloadคุณสมบัติก่อนไฟล์src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle - ทดสอบกับ Firefox และ Chrome รุ่นล่าสุด

คุณยังสามารถใช้คำตอบในโพสต์นี้ซึ่งฉันปรับให้เหมาะกับรูปภาพที่สร้างแบบไดนามิกภาพเดียว:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

ซอ


รอ. ทำไมตัวอย่างโค้ดที่สองของคุณถึงทำผิดและตั้งค่า.srcก่อนตั้งค่า. onload? คุณทำถูกแล้วในตัวอย่างโค้ดแรก แต่ทำให้โค้ดที่สองสับสน อันที่สองจะทำงานไม่ถูกต้องใน IE บางเวอร์ชัน
jfriend00

1
@ jfriend00 ไม่ไม่ยุ่ง รหัสสำรอง (รหัสที่ 2) มีไว้สำหรับในกรณีที่รหัสแรกหยุดทำงาน =]มันใช้การ.completeตรวจสอบในกรณีที่ภาพถูกแคชแล้วดังนั้นรหัสจึงแสดงให้เห็น แน่นอนว่าสำหรับแนวทางปฏิบัติที่ดีที่สุดคุณสามารถตั้งค่าการsrcผูก after all handlers ได้ตลอดเวลา
FabrícioMatté

4
ไม่มีเหตุผลที่จะต้องพึ่งพา.completeในกรณีนี้ เพียงตั้งค่าตัวจัดการโหลดของคุณก่อนที่จะตั้งค่า.srcและไม่จำเป็น ฉันได้เขียนสไลด์โชว์ที่ไซต์หลายพันแห่งใช้ในทุกเบราว์เซอร์ที่เป็นไปได้และเทคนิคแรกใช้ได้ทุกครั้ง ไม่จำเป็นต้องตรวจสอบ.completeเมื่อสร้างภาพใหม่ตั้งแต่เริ่มต้นเช่นนี้
jfriend00

เอาล่ะขอบคุณสำหรับหัวขึ้น, =]ปรับปรุงคำตอบที่จะสะท้อนให้เห็นถึงเหตุผลของคุณ นอกจากนี้ @ jfriend00 คุณสามารถตรวจสอบว่ารูปภาพโหลดใน IE ได้หรือไม่ สงสัยว่าเป็นปัญหากับเครือข่ายของฉันหรือกับ IE และรูปภาพ
FabrícioMatté

9
วันนี้ฉันพบว่า webkit ต้องการimg.src = ''ก่อนกำหนด src ใหม่หากเคยใช้มาก่อน
quux

10

หากตั้งค่า src ไว้แล้วเหตุการณ์จะเริ่มทำงานในกรณีแคชก่อนที่คุณจะได้รับตัวจัดการเหตุการณ์ ดังนั้นคุณควรทริกเกอร์เหตุการณ์ตาม.completeด้วย

ตัวอย่างโค้ด:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

มีสองวิธีแก้ปัญหาที่เป็นไปได้สำหรับสถานการณ์ประเภทนี้:

  1. ใช้วิธีแก้ปัญหาที่แนะนำในโพสต์นี้
  2. เพิ่มคำต่อท้ายที่ไม่ซ้ำกันให้กับรูปภาพsrcเพื่อบังคับให้เบราว์เซอร์ดาวน์โหลดอีกครั้งดังนี้:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

ในรหัสนี้ทุกครั้งที่เพิ่มการประทับเวลาปัจจุบันที่ส่วนท้ายของ URL รูปภาพคุณทำให้ไม่ซ้ำกันและเบราว์เซอร์จะดาวน์โหลดรูปภาพอีกครั้ง


44
ทั้งหมดนี้คือเอาชนะการแคช เป็นวิธีที่ผิดในการแก้ปัญหานี้ วิธีที่ถูกต้องอยู่ในคำตอบของ Fabricio เพียงตั้งค่า.onloadตัวจัดการก่อนที่จะตั้ง.srcค่าและคุณจะไม่พลาดเหตุการณ์การโหลดใน IE บางเวอร์ชัน
jfriend00

1
ใช่คุณพูดถูก แต่ไม่ต้องการแคชเสมอไปบางครั้งก็ไม่ควรแคชรูปภาพ แน่นอนในสถานการณ์เฉพาะนี้ขึ้นอยู่กับความต้องการ
haynar

1
ในแอพเชิงมุมของฉันฉันลองทุกอย่างที่คำตอบอื่น ๆ บอก แต่ไม่ได้ผล แต่การบังคับไม่ให้แคชเช่นคำตอบนี้บอกว่าใช้ได้ผลสำหรับฉัน บวกหนึ่งจากฉัน
ธนู

โซลูชันเดียวที่ใช้ได้ผลสำหรับฉันใน Chrome เวอร์ชันล่าสุด
Young Bob

3

ฉันได้พบกับปัญหาเดียวกันในวันนี้ หลังจากลองใช้วิธีการต่างๆฉันตระหนักดีว่าเพียงแค่ใส่รหัสขนาดไว้ข้างใน$(window).load(function() {})แทนที่จะdocument.readyแก้ปัญหาส่วนหนึ่ง (หากคุณไม่ได้เปิดหน้านี้)


นี่เป็นคำตอบที่ดีสำหรับสถานการณ์ที่เบราว์เซอร์มีแคชรูปภาพทำงานได้ดีกับการโหลดหน้าต่าง
Shocker

ปัญหาที่ฉันพบ เปลี่ยน$(document).readyเพื่อ$(window).loadแก้ไขปัญหาของฉัน
Tariqul Islam

0

ฉันพบว่าคุณสามารถทำได้ใน Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

การตั้งค่า. src เป็นตัวมันเองจะทริกเกอร์เหตุการณ์ onload

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