#javascript #wordpress #lazy-loading
Вопрос:
Я реализовал Intersection Observer на своем сайте WordPress, который находится в режиме разработки, и только последнее изображение внизу сайта загружается лениво.
Не уверен, почему это происходит. Смотрите ниже мой ленивый код.
/*Lazy load images*/
const allViews = document.querySelectorAll("[data-src]");
function preloadImage(img) {
const src = img.getAttribute("data-src");
if (!src) {
return;
}
img.src = src;
}
const options = {
root: null,
threshold: 0,
rootMargin: "0px",
};
const callback = function (entries) {
//console.log(entries);
};
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach((entry) => {
if (!entry.isIntersecting) {
return;
} else {
console.log(entry.target);
preloadImage(entry.target);
observer.unobserve(entry.target);
}
});
}, options);
allViews.forEach((image) => {
observer.observe(image);
});
В другом файле у меня есть скрипт jquery, добавляющий атрибут data-src ко всем изображениям и добавляющий класс lazyload:
/*change img src to img data-src for lazy load*/
$("img").each(function () {
$(this).attr("data-src", $(this).attr("src"));
$(this).addClass('lazyload');
//$(this).removeAttr("src");
//console.log($(this)[0].outerHTML);
});
Любая помощь будет отличной.
Ответ №1:
Я все еще не понимаю, почему вы на самом деле используете этот метод, потому что wordpress уже имеет встроенную поддержку loading =»lazy»
- Javascript может выполняться в том порядке, в котором он загружен, если код Jquery не загружен до кода IntersectionObserver, ваш скрипт станет бесполезным.
- у вас есть комментарий //$(this).removeAttr(«src»); это означает, что атрибут src все еще существует, и изображение будет загружено нормально. Вы должны раскомментировать его.
- Вместо того, чтобы тратить время на разработку lazyload, вы могли бы просто оставить wordpress для выполнения его изначально отложенной загрузки или использовать плагины, такие как W3 Total Cache, который имеет встроенную поддержку отложенной загрузки.
Комментарии:
1. Ну, в этом-то и дело. Отложенная загрузка из WordPress 5.8.1 не работает, и я не уверен, что это связано с тем, что все мои изображения являются webp. В любом случае, на другом веб-сайте коды ввода-вывода работают нормально, а ошибок вообще нет. Не уверен, что происходит.
2. Встроенная отложенная загрузка имеет порог 2500px, она будет загружать любые изображения, которые поставляются с разрешением 2500 пикселей, поэтому, если общая высота вашего веб-сайта падает на него, наивная отложенная загрузка не будет работать, так как все изображения будут загружены мгновенно Источник: web.dev/ browser-level-image-lazy-loading
3. Спасибо за это @Niresh. Мой собственный WordPress lazyload отключен, и мне удалось заставить его работать, но все изображения загружаются немедленно, хе-хе. По крайней мере, Google не жалуется… Google s ** ks
4. Я рад, что вы заставили его работать 🙂