Я хотел бы удалить прослушиватели событий с помощью JavaScript, но, похоже, это не работает... Я пытался передать debounce, а также функции showPopup в качестве аргументов для removeEventListener.
const elementToListenForScroll = document.querySelector('.howitworks__mainheading');
const distanceToTop = elementToListenForScroll.getBoundingClientRect().top;
function debounce(func, wait = 20, immediate = true) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
function showPopup() {
const currentScrollPosition = window.scrollY;
if (currentScrollPosition > distanceToTop) {
console.info('hey it works');
window.removeEventListener('scroll', debounce);
}
}
window.addEventListener('scroll', debounce(showPopup));
извините, не заметил :)
Разве не так? window.removeEventListener('scroll', showPopup); Функции, которые вы передаете, кажутся разными.
подумайте об удалении прокрутки событий в окне... Звучит странно
@Mr.Polywhirl похоже, что нет, потому что addEventListener принимает функцию debounce в качестве аргумента, поскольку сама функция debounce вызывает функцию showPopup.
@ ÁlvaroTouzón, как бы вы это реализовали иначе?
что нужно для удаления события прокрутки?



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


debounce(showPopup) — это не просто debounce.
Вызов debounce(showPopup) выполняет код, когда debounce просто ссылка на функцию.
Для доступа к removeEventListener вам необходимо передать ту же ссылку на функцию, которую вы передаете на addEventListener.
Присвойте debounce(showPopup) какой-либо переменной и используйте ее для подписки/отписки на события.
Пример:
const elementToListenForScroll =
document.querySelector('.howitworks__mainheading');
const distanceToTop = elementToListenForScroll.getBoundingClientRect().top;
var realReference = debounce(showPopup);
function debounce(func, wait = 20, immediate = true) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
function showPopup() {
const currentScrollPosition = window.scrollY;
if (currentScrollPosition > distanceToTop) {
console.info('hey it works');
window.removeEventListener('scroll', realReference);
}
}
window.addEventListener('scroll', realReference);window.removeEventListener ожидает функцию, зарегистрированную в окно.addEventListener. В нашем случае это функция, возвращаемая debounce(showPopup). Сохранить в переменной.
var debouncedShowPopup = debounce(showPopup);
function showPopup() {
const currentScrollPosition = window.scrollY;
if (currentScrollPosition > distanceToTop) {
console.info('hey it works');
window.removeEventListener('scroll', debouncedShowPopup);
}
}
window.addEventListener('scroll', debouncedShowPopup);
Привет, я сделал простой пример в jsfiddle, изменив окно для документа, чтобы получить доступ к событию прокрутки.
Гляньте, кажется покажите свой console.info('it works')
const elementToListenForScroll = document.querySelector('.howitworks__mainheading');
const distanceToTop = elementToListenForScroll.getBoundingClientRect().top;
console.info(distanceToTop, 'distanceToTop');
function debounce(func, wait = 20, immediate = true) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
function showPopup() {
console.info('deboundece', window.scrollY, distanceToTop);
const currentScrollPosition = window.scrollY;
if (currentScrollPosition > 100) {
console.info('hey it works');
document.removeEventListener('scroll', debounce);
}
}
console.info(document);
document.addEventListener('scroll', debounce(showPopup));.howitworks__mainheading {
position: relative;
display: block;
top: 900px;
}<div class = "howitworks__mainheading">
Any other way
</div>
java !== javascript