JavaScript выполнить что-то только один раз при скролле
Есть функция, следящая за скроллом страницы. Страница состоит из множества блоков, у каждого уникальный ID. Если какой-то блок попадает в видимую область страницы, то его ID должен записываться в массив mass. Проблема в том, что сейчас у меня ID блока добавляется в массив не один раз при его появлении, а постоянно при скролле, пока этот блок виден на странице. Весь код приводить не буду, приведу часть, которую необходимо подправить, а у меня не хватает знаний. Второе - если какой-то блок уходит из видимой области - его ID нужно из массива удалить. По идее это mass.shift, поскольку блоки идут один за одним, но не работает тоже. Заранее спасибо!
if( ... тут условие видимости ... ){
// если блок стал виден
mass.push(id);
}else{
// если уехал за границы
mass.shift(id);
}
document.getElementById("mass").innerHTML = mass; // выводим массив для просмотра
Ответы (3 шт):
Если каждый блок имеет свой уникальный id, то перед добавлением в массив, можно использовать indexOf, который возвращает индекс заданного элемента. Например имеем такой массив x = [5,6,4,7,3], x.indexOf(4) вернёт 2 - индекс элемента 4 и остановится, а если не находит заданный элемент, то возвращает -1.
То есть, в Вашем случае, можно написать так:
if( ... тут условие видимости ... ){
// если блок стал виден
if (mass.indexOf(id) == -1){ //проверяем если такого элемента нет в массиве
mass.push(id);
}
}
Вот с объектом вместо массива:
let obj = {}; // наш объект-хранилище
if( ... тут условие видимости ... ){
// если блок стал виден
obj[id] = true;
}else{
// если уехал за границы
delete obj[id];
}
// выводим для просмотра:
document.getElementById("mass").innerHTML = JSON.stringify( obj, null, 4 );
// проверяем содержится ли уже:
if( obj[id] ) ...