Я использую этот базовый c интервал и обратный вызов для запуска функции, когда существует определенный элемент DOM.
function ready(elem, callback) {
let loaded = setInterval(function(){
if ( document.querySelectorAll(elem).length ) {
clearInterval(loaded);
callback();
}
}, 100);
}
ready('elem', function(){
//code here
});
Теперь мне нужен способ запуска функции для элементов один за другим, так как они lazyload в ДОМ. Когда я прокручиваю страницу вниз, ленивая загрузка изображений с поддельным атрибутом sr c выглядит следующим образом: <img src="/blank.jpg">
. Затем сценарий, который у меня не контролируется, запускается, и sr c настраивается на фактическое изображение. Итак, мне нужен скрипт для ожидания существования этих ленивых загруженных изображений, ТОЧЕ ждите, чтобы источник больше не был поддельным.
Я знаю, что sr c больше не является поддельным, когда он содержит определенную подстроку - пример "foo": <img src="/imgnamefoo.jpg">
. Я знаю, сколько изображений должно попасть на страницу, потому что я получаю количество из глобального объекта. Кроме того, у изображений есть идентификаторы, которые нумеруются (id = "someid_1"), но я предпочитаю не полагаться на это, как в настоящее время. Мой текущий метод заключается в ожидании существования последнего изображения, проверяет подстроку на этом изображении, а затем запускает функцию на всех изображениях одновременно. Тем не менее, я хотел бы запускать его по мере появления изображений, чтобы меньше задержек, дающих пользователю возможность полностью прокрутить изображение до последнего изображения. К ним просто обращаются по мере их появления.
Мой текущий код, ожидающий существования последнего изображения:
window.quantity = object.images.length;
function ready(elem, callback) {
let loaded = setInterval(function(){
var src = document.querySelectorAll(elem)[0].getAttribute('src');
if ( src.indexOf('foo') !== -1 ) {
clearInterval(loaded);
callback();
}
}, 100);
}
ready('#someid_' + window.quantity, function(){
// code here
});
Если ожидается, что 7 изображений будут загружаться с задержкой, функция сработает когда этот элемент существует:
<img id="someid_7" src="/imgnamefoo.jpg">
РЕДАКТИРОВАТЬ: я пытался это попробовать и вызвать мой код, когда атрибут sr c был переписан:
$(document).on('load', 'img[src*="blank.jpg"]', function(){
//code here
});
И я тоже попробовал это, подозревая, что, возможно, элемент img был полностью переписан или заменен в DOM. Этот ищет новый sr c:
$(document).on('load', 'img[src*="foo.jpg"]', function(){
//code here
});
Оба были неудачными.
РЕДАКТИРОВАТЬ: РЕШЕНО! Вот код, который в итоге заработал:
(function(){
const daReviewItems = digitalData.cart.item.length;
function whenRemoved(element, callback) {
var interval = setInterval(function() {
if (document.querySelectorAll(element).length < daReviewItems) {
callback();
}
}, 100);
return interval;
}
function whenExists(element, callback) {
var interval = setInterval(function() {
if (document.querySelectorAll(element).length) {
clearInterval(interval);
callback();
}
}, 100);
return interval;
}
var loop_id = 0;
whenRemoved('elem',function(){
if (loop_id) return;
loop_id = whenExists('img',function(){
//SOME CODE HERE
loop_id = 0;
});
});
})();
Он обернут в анонимную функцию, чтобы сохранить глобальную область видимости. По сути, он ожидает, что 'elem' не существует, а затем проверяет, существует ли img, который я хочу отредактировать. Если это так, то любые imgs, к которым я еще не добавил класс 'elem', заставляют функцию запускаться на них. Итак, при начальной загрузке 'elem' не существует, потому что я еще не добавил этот класс, поэтому код срабатывает. Затем, если imgs удаляется или перезагружается, мой класс 'elem' удаляется, поэтому он снова запускается и снова ждет imgs. Loop_id проверяет итерацию и предотвращает бесконечный цикл кода. Я должен поблагодарить разработчика, которого я знаю, за помощь в этом. У него нет пользователя здесь, но он заслуживает доверия. Итак, спасибо!