2013-02-20 31 views
14

Tôi có thể sử dụng:Sủi bọt có sẵn cho các sự kiện tải ảnh không?

window.addEventListner(); 

theo một cách nào đó.

Tất cả hình ảnh của tôi có display = 'none'.

Khi hình ảnh đã được nạp,

Tôi muốn thiết display = 'inline'

Bằng cách này tôi có thể bình thường hóa những gì được hiển thị trong khi hình ảnh đang được tải về.

Trong trường hợp này, tôi không thể tải trước hình ảnh của mình.

Trả lời

10

Sự kiện load/onload không làm bong bóng (reference, reference), vì vậy những gì bạn đang yêu cầu là không thể. Bạn sẽ phải đính kèm một trình xử lý sự kiện cho mỗi nút hình ảnh.

+0

Thậm chí không "bất thường". Một thêm ref: http://www.w3.org/TR/DOM-Level-3-Events/#event-type-load – bfavaretto

+0

Tôi đã nghĩ rằng đây là sự kiện sôi nổi. Nhưng tôi đoán là không, tôi đã cập nhật câu hỏi của mình. –

+0

Nhiều sự kiện khác bong bóng, như 'nhấp chuột' và điều đó chắc chắn hữu ích. Nhưng thực tế là 'tải' không bong bóng không có nghĩa là bạn không thể tải trước hình ảnh của mình. Tại sao không tạo ra một hàm duy nhất để xử lý 'tải' cho tất cả các hình ảnh? – bfavaretto

0
$('img').on('load', function() { 
    $(this).show() 
}) 

Nếu không có thư viện:

window.onload = function() { 
    var imgs = document.querySelectorAll('img') 
    imgs.onload = function() { 
     this.style.display = 'inline'; 
    } 
} 
+0

@pure_code cập nhật câu trả lời của tôi cho bạn? :-) – Neal

+0

Không phải 'window.onload' được gọi là * sau khi * tất cả hình ảnh đã được tải chưa? –

+0

@FelixKling không nhất thiết. – Neal

1

Bạn có thể sử dụng các handler Image.onload sự kiện nhưng không có bọt liên quan.

var i = new Image; 
i.onload = function() { 
    this.style.display = 'block'; 
} 
2
Array.prototype.forEach.call(document.querySelectorAll('img'), function (elem) { 
    elem.addEventListener('load', function() { 
     this.style.display = 'inline'; 
    }); 
    if (elem.complete) { 
     elem.style.display = 'inline'; 
    } 
}); 

Các "tải" Sự kiện này sẽ không kích hoạt nếu hình ảnh được tình cờ nạp đã; do đó, chúng tôi kiểm tra xem complete đã được đặt chưa.

39

Sử dụng chụp nghe sự kiện trên một số nút DOM khác hơn window (body hoặc cha mẹ khác của các yếu tố hình ảnh quan tâm):

document.body.addEventListener(
    'load', 
    function(event){ 
     var tgt = event.target; 
     if(tgt.tagName == 'IMG'){ 
      tgt.style.display = 'inline'; 
     } 
    }, 
    true // <-- useCapture 
) 

Với điều này bạn không cần phải (lại) đính kèm xử lý sự kiện trong khi lặp qua document.images.

Và điều này cũng sẽ hoạt động với hình ảnh được chèn động.

Same is true for image's error loading events. MDN: addEventListener

+1

Tôi chưa bao giờ nghĩ đến việc thử sự kiện này cho các sự kiện tải hình ảnh. Khá rực rỡ! Và lý do không thể là cửa sổ: "Vì lý do cũ, tải sự kiện cho tài nguyên bên trong tài liệu (ví dụ: hình ảnh) không bao gồm Cửa sổ trong đường dẫn truyền trong triển khai HTML" – Adria

Các vấn đề liên quan