Заявление:
window.addEventListener("scroll", this.scroll() );
Привязывает к событию результат this.scroll()
, который является вызовом функции. Такой вызов возвращает undefined
, потому что метод scroll
не имеет инструкции return
:
scroll() {
let top = window.pageYOffset;
console.log(top + " vs " + this.offsetTop);
if (top >= this.offsetTop) {
this.el.classList.add('is-sticky');
} else {
this.el.classList.remove('is-sticky');
}
}
Правильный путь
НЕ используйте:
window.addEventListener("scroll", this.scroll);
Приведенный выше код свяжет this
с window
при срабатывании события.
ПРАВИЛЬНЫЙ способ использования:
window.addEventListener("scroll", (e) => {
this.scroll();
});
Or
window.addEventListener("scroll", this.scroll.bind(this));
Который, когда событие инициируется, будет иметь код внутри this.scroll
, указывающий this
на экземпляр текущего класса (Sticky
).
Удаление прослушивателя событий
Чтобы удалить событие, вызовите window.removeEventListener
, но есть предостережение: removeEventListener
нужно вызывать с тем же аргументом, что и в addEventListener
, чтобы удалить прослушиватель. Другими словами, чтобы иметь возможность удалить, вам нужно будет сделать:
// save the function that will be bound to the event, so you can remove it later
this.scrollBoundFunction = this.scroll.bind(this);
window.addEventListener("scroll", this.scrollBoundFunction);
// and later
window.removeEventListener("scroll", this.scrollBoundFunction);
person
acdcjunior
schedule
04.03.2018
foo(bar())
bar
всегда вызывается первым, и его возвращаемое значение передается вfoo
.addEventListener
ожидает передачи функции, вы передаете возвращаемое значениеthis.scroll()
(которое не является функцией). - person Felix Kling   schedule 04.03.2018