Класс Div, показывать предупреждение, когда div находится на экране, но только один раз для каждого div?

У меня есть функция, которую я хотел бы показывать предупреждение каждый раз, когда div class=promote отображается на экране. Но это предупреждение может отображаться только один раз для каждого элемента div.

Моя проблема в том, что я не могу получить идентификатор данных div и не могу показывать предупреждение только один раз для каждого div, когда он находится на экране, только первый из них запускает предупреждение и все время.

Есть идеи, как это решить?

function elementInView(elem) {
  return $(window).scrollTop() < $(elem).offset().top + $(elem).height();
};

$(window).scroll(function() {
  if (elementInView($('.promote'))) { //how to get any promote, not only the first? show alert only once per promote seen?
    var dataid = $(this).data("id"); //how to get data-id of the active class?
    alert(dataid);
  }
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<br><br><br><br><br><br><br><br>

<div class=promote data-id=1>div 1</div>

<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>

<div class=promote data-id=2>div 2</div>

<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>

<div class=promote data-id=3>div 3</div>

<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>

<div class=promote data-id=4>div 4</div>

http://jsfiddle.net/y8fhnLt9/

Может быть, это поможет medium.com/talk-like/…

maximelian1986 21.01.2019 13:01

$('.promote') не может быть отдельным элементом, возможно, массивом. $('.продвижение').forEach(...

Matthew Page 21.01.2019 13:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы ищете что-то вроде этого, но обратите внимание, что он на самом деле не оптимизирован, поскольку он перебирает все элементы при каждой прокрутке... некоторое пространство для оптимизации:

function elementInView(elem){
  return $(window).scrollTop() < $(elem).offset().top + $(elem).height();
};

let shownElements = [];

$(window).scroll(function(){
  let elements = $('.promote');
  for (let i = 0; i < elements.length; i++) {
    let element = elements[i];
    if (elementInView(element)) { // check if the element is in view
      if (!shownElements.includes(element)) { // check if element already alerted/shown
        let dataid = $(element).attr("data-id"); // get the data-id value
        console.info("IN VIEW", element, dataid);
        shownElements[i] = element;
      }
    }
  }
});

Обновлено, чтобы отслеживать, какие элементы уже были показаны. Так что стреляем только один раз.

http://jsfiddle.net/mxmz_/wzh2xvdo/24/

это хорошо, но он все время срабатывает;/ вместо console.info я добавлю ajax, поэтому я не могу отправлять ajax-вызов 5000 раз в секунду... может быть, используя .next() или что-то в этом роде ?

RGS 21.01.2019 13:13

Обновлен ответ, чтобы отслеживать, какие элементы уже были показаны

Maksim Luzik 21.01.2019 13:25
Ответ принят как подходящий

Я думаю, что функция, которую вы используете для проверки того, находится ли элемент в области просмотра, также нуждается в некоторой коррекции.

http://jsfiddle.net/tsq4ngcf/1/

function elementInView(elem){
    var shown = $(elem).data("shown");
  if (shown){
    return false;
  } 
  var elTop = $(elem).offset().top;
  var elBottom = $(elem).offset().top + $(elem).outerHeight();
  var screenBottom = $(window).scrollTop() + $(window).innerHeight();
  var screenTop = $(window).scrollTop();

  if ((screenBottom > elTop) && (screenTop < elBottom)){
    return true;
  } else {
    return false;
  }
}


$(window).scroll(function(){
    $('.promote').each(function() {
    if (elementInView(this)) {
        var dataid = $(this).data("id");
      $(this).attr('data-shown','1');
      alert(dataid);
     }

    }
  );

});

Для этого вам нужно добавить некоторое свойство данных с помощью div, когда оно появится в поле зрения в первый раз.

Vineesh 21.01.2019 13:20

если можно, не могли бы вы привести пример?

RGS 21.01.2019 13:22

Другие вопросы по теме