РЕДАКТИРОВАТЬ: я работал над своими функциями и соответственно обновил их в этом посте
Я хочу реализовать отложенную загрузку изображений на веб-сайт. Эти изображения находятся в разных галереях, которые загружаются асинхронно, в зависимости от того, какую галерею хочет видеть пользователь.
Моя проблема в том, что иногда IntersectionObserver
сообщает, что все изображения пересекаются.
Это моя lazy load
функция:
function lazyLoad(lazyImgs) {
console.log('lazyLoad fired', lazyImgs);
const imgOptions = {
threshold: 0,
rootMargin: '0px 0px 0px 0px'
};
const imgObserver = new IntersectionObserver((entries, imgObserver) => {
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
let lazyImage = entry.target;
let sources = lazyImage.children;
for (let s = 0; s < sources.length; s++) {
let source = sources[s];
console.log('intersecting: ', source);
imgObserver.unobserve(lazyImage);
}
} // end is intersecting
});
}, imgOptions);
lazyImgs.forEach(img => {
imgObserver.observe(img);
});
} // end lazyLoad();
lazyLoad();
вызывается при конец этой функции, когда содержимое загружено:
function getContent(url) {
url = url.split('#');
link = url[1] + '.php';
// load content into the content-wrapper
let str = $('.content-wrapper').load('inc.galleries/' + link, function(
responseTxt,
statusTxt,
xhr
) {
if (statusTxt == 'error') {
console.log('Error: ' + xhr.status + ': ' + xhr.statusText);
}
});
// Convert the HTML string into a document object
let $contentWrapper = $('.content-wrapper');
html = $.parseHTML(str);
nodeName = [];
// Append the parsed HTML
$contentWrapper.append(html);
// when Ajax request is complete...
// ...get all images with a class of lazyImgs and run lazyLoad function :)
$(document).ajaxStop(function() {
let lazyImgs = document.querySelectorAll('.lazyImg');
lazyLoad(lazyImgs);
});
}
let lazyImgs
возвращает мне список узлов со всеми элементами изображения с классом lazyImg
, поэтому DOM
, похоже, имеет был успешно обновлен. Но IntersectionObserver
все еще не может определить, какие изображения находятся внутри области просмотра.
РЕДАКТИРОВАТЬ 2: Я подозреваю, что IntersectionObserver
обнаруживает, что изображения пересекаются при загрузке и, следовательно, еще не имеют полного размера. У кого-нибудь есть идеи, как я мог go об этом?