У меня есть функция, которую я хотел бы показывать предупреждение каждый раз, когда 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>$('.promote') не может быть отдельным элементом, возможно, массивом. $('.продвижение').forEach(...



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы ищете что-то вроде этого, но обратите внимание, что он на самом деле не оптимизирован, поскольку он перебирает все элементы при каждой прокрутке... некоторое пространство для оптимизации:
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() или что-то в этом роде ?
Обновлен ответ, чтобы отслеживать, какие элементы уже были показаны
Я думаю, что функция, которую вы используете для проверки того, находится ли элемент в области просмотра, также нуждается в некоторой коррекции.
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, когда оно появится в поле зрения в первый раз.
если можно, не могли бы вы привести пример?
Может быть, это поможет medium.com/talk-like/…