2012-01-23 16 views
10

Tôi có một số hình ảnh tải từ bên ngoài và không kiểm soát được tính khả dụng của chúng. Tôi đã tìm thấy rằng dưới tải nặng đôi khi họ không tải được, nhưng trên một làm mới nhanh chóng họ sẽ hiển thị ngay lập tức.Cách phát hiện lỗi tải hình ảnh và nếu không thành công, hãy thử tải lại cho đến khi thành công?

Có cách nào để phát hiện xem hình ảnh có tải không và sau đó nếu có, hãy gợi ý tải lại trên img src cho đến khi tải? Nếu vậy, bạn có thể vui lòng cung cấp một ví dụ không?

Trả lời

7

Đây là thứ tôi đã biên dịch có thể giúp ích. Tôi không thể kiểm tra việc này, vui lòng cho tôi biết nếu bạn gặp bất kỳ vấn đề nào.

$(function() { 
    var $images = $('img.imageClassUpdateAtInterval:not([src="/assets/spinner.gif"])'); 

    // Now, no such image with 
    // a spinner 
    if($images.length === 0 && window.imageLocator) 
    clearInterval(window.imageLocator); 


    window.imageLocator = setInterval(function() { 
     $images.each(function() { 
      $this = $(this); 
      if (!$this.data('src')) { 
       $this.data('src', $this.prop('src')); 
      } 

      $this.prop('src', $this.data('src') + '?timestamp=' + new Date().getTime()); 
      console.log($this.prop('src')); 
     }); 
    }, 60 * 1000); 

    // suppose, an error occured during 
    // locating the src (source) of the 
    // image - image not found, network 
    // unable to locate the resource etc. 
    // it will fall in each time on error 
    // occurred 
    $('img.imageClassUpdateAtInterval').error(
      function() { 
       // set a broken image 
       $(this).unbind("error").attr("src", "/assets/broken.gif"); 
       // setting this up in relative 
       // position 
       $(this).css("position", "relative"); 
       $(this).apppend("<span>Error occured</span>"); 
       $(this).find("span").css({"position": "absolute", "background-color": "#252525", "padding": ".3em", "bottom": "0"}); 
    }); 

}); 

Các giải pháp trên được biên soạn từ hai giải pháp khác nhau bắt đầu bởi @user113716@travis

+0

Đó là đầu vào tuyệt vời. Cảm ơn! Tôi thích thông tin bổ sung. Đây là js ban đầu tôi đang sử dụng để thực sự tải lại một số hình ảnh dựa trên một lớp học mỗi 60 giây. Tôi sẽ * rất * đánh giá cao việc thấy điều này được tích hợp vào mã sau đây tôi đang sử dụng để hai ví dụ bạn đã tích hợp đúng (tôi khá mới để làm việc trong js ở bất kỳ mức độ quan trọng): http: // j. mp/wzi7FI – ylluminate

+0

Xin lỗi ylluminate. Tôi đã đi. Tôi đã chỉnh sửa bài đăng của mình và tôi hy vọng điều này sẽ giúp bạn. –

+0

Hoạt động tốt, cảm ơn! Có một vài điều chỉnh để thực hiện, nhưng bạn đã nhận nó xuống đủ tốt. Siêu công việc. – ylluminate

16
<img onerror="dosomthing()" ...> 
+4

Đó là '$ ('# myImg') bind ('lỗi', function (e) {...}); 'trong jQuery :) – jocull

+0

Giải pháp đơn giản nhất để thay thế hình ảnh không tải được bằng hình ảnh mặc định. – MastaBaba

5

hãy nhìn vào mã này:

$('img.autoFix').error(function(){ 
    var src = this.src; 
    this.src = src.substr(0, src.indexOf('?')) + '?t=' + new Date().getTime() 
}); 
+1

Nó sẽ không đi vào một vòng lặp vô hạn trong trường hợp hình ảnh không tồn tại hoặc có một số vấn đề liên tục khác với nó? – fejese

+1

nó sẽ, nhưng nếu bạn muốn, bạn có thể sử dụng thuộc tính dữ liệu để giới hạn số lần thử. – Kiyan

+2

... hoặc sử dụng một setTimeout trong chức năng lỗi để không làm cho nó tải lại như điên. – markj

1

Đây là một cách tiếp cận rất đơn giản để xử lý tất cả các hình ảnh trên trang.


https://github.com/doomhz/jQuery-Image-Reloader

jQuery ảnh reloader

Lực lượng trình duyệt để thử lại tải những hình ảnh bị hỏng. Một giải pháp tốt cho hình ảnh được lưu trữ trong một đám mây (ví dụ Amazon S3).

Tại sao và khi nào nên sử dụng?

Plugin này có hiệu quả khi bạn tải hình ảnh từ đám mây (ví dụ: Amazon S3) và CDN có sự chậm trễ cho đến khi hình ảnh có thể truy cập được. Trình duyệt sẽ hiển thị biểu tượng hình ảnh bị hỏng thay vào đó và sẽ không thử tải lại nó. jQuery Image Reloader sẽ xử lý điều đó.

đang Plugin

Mã duy nhất bạn cần phải kích hoạt các plugin là thế này:.

$(".slow-images").imageReloader(); 
Các vấn đề liên quan