Я пытаюсь реализовать отложенную загрузку изображений с помощью IntersectionObserver, где это возможно, и с помощью полизаполнения в противном случае (как рекомендуется здесь ).
+function ($, window, document, undefined) {
var lazyImages = [].slice.call(document.querySelectorAll("img.lazy"));
var lazyLoadImage = function() {
var lazyImageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var lazyImage = entry.target;
lazyImage.src = lazyImage.dataset.src;
lazyImage.classList.remove("lazy");
lazyImageObserver.unobserve(lazyImage);
}
});
});
lazyImages.forEach(function(lazyImage) {
lazyImageObserver.observe(lazyImage);
});
};
var lazyLoadImagePolyfill = function() {
var active = false;
if (active === false) {
active = true;
setTimeout(function() {
lazyImages.forEach(function(lazyImage) {
if ((lazyImage.getBoundingClientRect().top <= window.innerHeight
&& lazyImage.getBoundingClientRect().bottom >= 0)
&& getComputedStyle(lazyImage).display !== 'none') {
console.log('lazyImage:', lazyImage);
lazyImage.src = lazyImage.dataset.src;
lazyImage.classList.remove('lazy');
lazyImages = lazyImages.filter(function(image) {
return image !== lazyImage;
});
if (lazyImages.length === 0) {
document.removeEventListener('scroll', lazyLoadImagePolyfill);
window.removeEventListener('resize', lazyLoadImagePolyfill);
window.removeEventListener('orientationchange',
lazyLoadImagePolyfill);
}
}
});
active = false;
}, 200);
}
document.addEventListener("scroll", lazyLoadImagePolyfill);
window.addEventListener("resize", lazyLoadImagePolyfill);
window.addEventListener("orientationchange", lazyLoadImagePolyfill);
};
document.addEventListener('DOMContentLoaded', function(){
if ("IntersectionObserver" in window) {
lazyLoadImage();
} else {
lazyLoadImagePolyfill();
}
});
}(jQuery, window, document)
Этот подход работал правильново всех браузерах, которые я тестировал, кроме IE.Я получаю SCRIPT5007: Unable to get property 'src' of undefined or null reference
в консоли;строка, которая выдает ошибку - lazyImage.src = lazyImage.dataset.src;
.Однако console.log, предшествующий этой строке, показывает следующее:
lazyImage: [object HTMLImageElement]
"lazyImage:"
<img class="lazy" src="placeholder.png" data-src="real-pic.jpg"></img>
Обратите внимание: меня попросили не использовать внешнюю библиотеку или плагин.Есть идеи, почему это происходит и как это исправить?