sự kiện jQuery cho hình ảnh được tải


96

Có thể phát hiện khi tất cả hình ảnh được tải qua sự kiện jQuery không?

Tốt nhất, nên có một

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

hoặc là

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

Nhưng tôi không thể tìm thấy một thứ như vậy.

Tôi đã nghĩ đến việc đính kèm một sự kiện như thế này:

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

Nhưng liệu điều này có bị phá vỡ nếu một hình ảnh không tải được không? Điều cực kỳ quan trọng là phương thức được gọi và vào đúng thời điểm.


9
Tại sao bạn không sử dụng sự kiện onload: $ (window) .load (doStuff)? Tuy nhiên, khi tải lên cũng sẽ đợi các tài nguyên khác (ví dụ: tập lệnh, bảng định kiểu & flash) chứ không chỉ hình ảnh, điều này có thể phù hợp với bạn hoặc không.
moff

Việc đính kèm một sự kiện tải vào tất cả các thẻ img, như bạn có trong mẫu mã của mình, sẽ hoạt động. Nếu một hình ảnh không tải được doStuff () sẽ không được gọi, nhưng điều đó có vẻ hợp lý với yêu cầu của bạn rằng tất cả các hình ảnh phải được tải.
Steve Goodman

2
Phương thức .load () không được dùng nữa kể từ jQuery 1.8. Kiểm tra điều này: stackoverflow.com/questions/3877027/…
fiorix,

Câu trả lời:


116

Theo tài liệu của jQuery , có một số lưu ý khi sử dụng sự kiện tải với hình ảnh. Như đã lưu ý trong một câu trả lời khác, plugin ahpi.imgload.js đã bị hỏng, nhưng ý chính của Paul Ireland được liên kết không còn được duy trì.

Theo Paul Irish, plugin chuẩn để phát hiện các sự kiện tải hình ảnh hoàn thành hiện có tại:

https://github.com/desandro/imagesloaded


4
Đây là câu trả lời- xử lý nhiều hình ảnh, hình ảnh được lưu trong bộ nhớ cache, các hình ảnh kỳ quặc của trình duyệt, hình ảnh bị hỏng, và đó là hiện tại. Xinh đẹp.
Yarin

7
đã thử nghiệm nó ngày hôm nay. đã hoạt động trong 2 phút.
CodeToad

Đồng ý với @Yarin, tài liệu tốt, dễ sử dụng, nhiều, được lưu trong bộ nhớ cache, bị hỏng và hiện tại. Yêu nó.
johntosystemur

Tuy nhiên, về nhược điểm, imagesLoaded không hỗ trợ IE7 nếu điều đó quan trọng với bạn.
johntooterur

1
Một bản sửa lỗi 2 dòng nhanh chóng và đơn giản để imageLoaded hoạt động trên IE7 .
tham gia

63

Nếu bạn muốn kiểm tra không phải tất cả các hình ảnh mà là một hình ảnh cụ thể (ví dụ: hình ảnh mà bạn đã thay thế động sau khi DOM đã hoàn thành), bạn có thể sử dụng điều này:

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

70
Hãy cẩn thận, vì load()nó sẽ không kích hoạt khi hình ảnh đã được tải. Điều này có thể xảy ra dễ dàng khi hình ảnh nằm trong bộ nhớ cache của trình duyệt của người dùng. Bạn có thể kiểm tra xem hình ảnh đã được tải chưa bằng cách sử dụng $('#myImage').prop('complete'), kết quả này sẽ trả về true khi hình ảnh được tải.
Blaise

6
Tại sao điều này lại có nhiều phiếu bầu khi a) không trả lời câu hỏi của anh ta và b) đưa ra một giải pháp kém bên cạnh đó? (Meanshile câu trả lời đúng là của @ johnpolacek và có 1 phiếu bầu)
Yarin

5
CẢNH BÁO!!!!!!!!!!!!!!! Đây không phải là câu trả lời chính xác. johnpolacek có câu trả lời chính xác. Hãy bình chọn câu trả lời của anh ấy.
mrbinky3000

4
Những phản đối này dường như không còn liên quan nữa ngoại trừ trong một trường hợp rất cụ thể: Webkit khi bạn thay đổi src của một hình ảnh thành src chính xác như trước. Đối với hình ảnh bạn vừa thêm vào DOM, $ (...). Load () phải là đủ. Thử nghiệm trong FF hiện tại và Chrome, và IE6-9: jsfiddle.net/b9chris/tXVCe/2
Chris Moschini

1
+1 Hoạt động tốt khi (bạn biết đó) hình ảnh không có trong bộ nhớ cache của trình duyệt.
Lode

28

Bạn có thể sử dụng plugin waitForImages của tôi để xử lý việc này ...

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

Ưu điểm của điều này là bạn có thể bản địa hóa nó thành một phần tử tổ tiên và nó có thể tùy chọn phát hiện các hình ảnh được tham chiếu trong CSS.

Tuy nhiên, đây chỉ là phần nổi của tảng băng chìm, hãy kiểm tra tài liệu để biết thêm chức năng.


Chào Alex, có vẻ đầy hứa hẹn. Nhưng giống như đã đề cập trong các câu trả lời và nhận xét do johnpolacek và hirisov đưa ra, nó có bao gồm trường hợp hình ảnh đã có trong bộ nhớ cache của trình duyệt không?
SexyBeast

Tôi có một quy trình tạo hình ảnh và tải nó một cách động sau khi trang đã được tải xong và tôi cần hiển thị trình tải ajax trong khi người dùng chờ đợi. Plugin này hoạt động hoàn hảo cho trường hợp sử dụng đó. Tuy nhiên, bạn phải gọi hàm sau khi thiết lập thuộc tính img src!
John Livermore

20

Việc sử dụng jQuery $ (). Load () làm trình xử lý sự kiện IMG không được đảm bảo. Nếu hình ảnh tải từ bộ nhớ cache, một số trình duyệt có thể không kích hoạt sự kiện. Trong trường hợp phiên bản Safari (cũ hơn?), Nếu bạn đã thay đổi thuộc tính SRC của phần tử IMG thành cùng một giá trị , thì sự kiện tải lên sẽ KHÔNG kích hoạt.

Có vẻ như điều này đã được công nhận trong jQuery (1.4.x) mới nhất - http://api.jquery.com/load-event - để trích dẫn:

Có thể sự kiện tải sẽ không được kích hoạt nếu hình ảnh được tải từ bộ nhớ cache của trình duyệt. Để giải thích khả năng này, chúng tôi có thể sử dụng sự kiện tải đặc biệt sẽ kích hoạt ngay lập tức nếu hình ảnh đã sẵn sàng. event.special.load hiện có sẵn dưới dạng plugin.

Hiện có một trình cắm để nhận dạng trường hợp này và thuộc tính "hoàn chỉnh" của IE cho trạng thái tải phần tử IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

Theo câu trả lời này , bạn có thể sử dụng sự kiện tải jQuery trên windowđối tượng thay vì document:

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

Điều này sẽ được kích hoạt sau khi tất cả nội dung trên trang đã được tải xong. Điều này khác với jQuery(document).load(...)điều này được kích hoạt sau khi DOM tải xong.


Điều này thật đúng với gì mà tôi đã tìm kiếm!
Eric K

4

imagesLoaded Plugin là cách để bắt đầu, nếu bạn cần một giải pháp trình duyệt chéo

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

Nếu bạn chỉ cần một Giải pháp Thay thế IE, Điều này Sẽ Làm được

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


2

Đối với hình ảnh có cùng nguồn gốc, bạn có thể sử dụng:

$.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
$( "img.photo" ).load(function() {

    $(".parrentDiv").css('height',$("img.photo").height());
    // very simple

}); 

0

Tôi đã tạo tập lệnh của riêng mình, vì tôi thấy nhiều plugin khá cồng kềnh và tôi chỉ muốn nó hoạt động theo cách tôi muốn. Tôi sẽ kiểm tra xem mỗi hình ảnh có chiều cao hay không (chiều cao hình ảnh gốc). Tôi đã kết hợp nó với hàm $ (window) .load () để giải quyết các vấn đề về bộ nhớ đệm.

Tôi đã nhận xét nó khá nhiều mã, vì vậy nó sẽ rất thú vị khi xem xét, ngay cả khi bạn không sử dụng nó. Nó hoạt động hoàn hảo cho tôi.

Không cần quảng cáo thêm, đây là:

Tập lệnh imgLoad.js


0

Đang đợi tất cả các hình ảnh tải ...
Tôi đã tìm thấy trình khắc phục sự cố của tôi với jfriend00 tại đây jquery: làm thế nào để lắng nghe sự kiện tải hình ảnh của một div container? .. và "if (this.complete)"
Đang đợi tất cả mọi thứ tải và một số có thể trong bộ nhớ cache! .. và tôi đã thêm sự kiện "error" ... nó rất mạnh trên tất cả các trình duyệt

$(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...
    });
});

Demo: http://jsfiddle.net/molokoloco/NWjDb/


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.