Событие .click срабатывает несколько раз

На странице есть ссылка с id get-more-posts, по клику на которую загружаются статьи. Изначально он находится за пределами экрана. Задача состоит в том, чтобы прокрутить экран до этой ссылки, нажав на нее. Код ниже делает то, что вам нужно. Но событие называется много раз. Нужен только один клик, когда я доберусь до прокрутки этого элемента.

p.s. Извините за мой плохой английский

$(window).on("scroll", function() {
if ((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){
    $('#get-more-posts').click();
}
});

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

charlietfl 27.07.2019 19:37

На первой странице 6 постов. При переходе по ссылке загружается еще 6. Итак, теперь событие выполняется много раз, поэтому не 6, а 20-30 сообщений. То есть, если я правильно понял Ваш ответ, у меня плохой английский, извините.

user11230404 27.07.2019 19:48

Не могли бы вы показать пример использования debounce для моей ситуации?

user11230404 27.07.2019 19:49
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
153
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте использовать removeEventListener или используйте переменную с флагом, просто прокрутка событий сразу отделяется больше

Не могли бы вы набросать пример. Я даже не знаю, как это реализовать.

user11230404 27.07.2019 19:15

var handleScroll = функция () {if (someCandition){ окно. removeEventListener(handleScroll) } }; окно. addEventListener('прокрутка', handleScroll); // после вызова метода removeEventListener дескриптор функции прокрутка не будет прослушиваться

Sporx 27.07.2019 20:13

Вы можете настроить регулирование, проверив, выполняете ли вы уже обратный вызов. Один из способов — функция setTimeout, как показано ниже:

var throttled = null;
$(window).on("scroll", function() {
    if (!throttled){
        throttled = setTimeout(function(){
            if ((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){
                $('#get-more-posts').click();
                throttled = null;
            }
        }.bind(window), 50);
    }
}.bind(window));

Вот версия ES6, которая может решить проблемы с областью действия, о которых я упоминал:

let throttled = null;
$(window).on("scroll", () => {
    if (!throttled){
        throttled = setTimeout(() => {
            if ((($(window).scrollTop()+$(window).height())+250)>=$(document).height()){
                $('#get-more-posts').click();
                throttled = null;
            }
        }, 50);
    }
});

Последний аргумент setTimeout — это задержка перед запуском. Я выбрал 50 произвольно, но вы можете поэкспериментировать, чтобы увидеть, что работает лучше всего.

Я бы проверил это в отладчике, чтобы увидеть, происходит ли что-то еще. По общему признанию, я не часто использую jquery, но у меня есть несколько ванильных проектов javascript, где я делаю все вышеперечисленное без проблем. Возможно, есть что-то, что нужно передать, чтобы дать функции некоторый контекст для работы с jQuery. Добавил некоторые правки, дайте мне знать, если они помогут.

GenericUser 27.07.2019 20:09

Я был бы признателен, если бы вы взглянули.

user11230404 27.07.2019 20:15
Ответ принят как подходящий

Не знаю, насколько это правда, но работает. После события (щелчка) удалите идентификатор элемента, а затем добавьте его снова, чтобы щелчок выполнялся один раз. Прокручиваем страницу до нужного элемента, снова нажимаем, удаляем id и снова добавляем. Оно работает. Может кому пригодится.

window.addEventListener('scroll', throttle(callback, 50));
function throttle(fn, wait) {
 var time = Date.now();
 return function() {
   if ((time + wait - Date.now()) < 0) {
     fn();
     time = Date.now();
   }
 }
}
function callback() {
 var target = document.getElementById('get-more-posts');

if ((($(window).scrollTop()+$(window).height())+650)>=$(document).height()){
               $('#get-more-posts').click();
               $("#get-more-posts").removeAttr("id");
             //$(".get-more-posts").attr("id='get-more-posts'");
       };         

}
window.removeEventListener('scroll', throttle(callback, 50));

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