1 回答

TA貢獻1811條經驗 獲得超5個贊
您目前正在為每次更新向瀏覽器添加一個新事件。一個簡單的解決方案如下:
const scroll = {
eventsAlreadyAdded: false,
create: function (el) {
this.scrollAnimation = gsap.timeline({ repeat: -1 });
// another piece of awesome code here...
if (!scroll.eventsAlreadyAdded) {
this.create__addMouseEvents(el);
scroll.eventsAlreadyAdded = true;
}
},
create__addMouseEvents: function (el) { /* .. */ },
update: function () { /* .. */ },
init: function () { /* .. */ }
}
由于您沒有實例化滾動對象,因此必須更改全局引用 scroll.eventsAlreadyAdded。
或者,您可以稍微重寫代碼,以便處理實例化變量(未測試):
class Scroll {
/**
* Returns the element
* @type {Node}
*/
static get element() {
return document.querySelector('THE ELEMET SELECTOR');
}
/**
* Initial the scroll event to given element
* @param {Node} el the element that will get an animation
*/
constructor(el) {
this.el = el;
/**
* Remembers whether the events have already been attached to the element
* @type {boolean}
*/
this.eventsAlreadyAdded = false;
/**
* The timeline instanze from gsap
* @type {Timeline}
*/
this.scrollAnimation = null;
this.create();
}
create() {
this.scrollAnimation = gsap.timeline({
repeat: -1
});
// another piece of awesome code here...
this.addMouseEvents();
}
addMouseEvents() {
if (this.eventsAlreadyAdded) return;
this.el.addEventListener('mouseover', () => this.scrollAnimation.pause());
this.el.addEventListener('mouseout', () => this.scrollAnimation.resume());
this.eventsAlreadyAdded = true;
}
update() {
if (this.scrollAnimation) {
this.scrollAnimation.kill();
}
this.create();
}
}
let scroll = null;
let windowResizeTimer = null;
document.addEventListener('DOMContentLoaded', () => {
scroll = new Scroll(Scroll.element)
});
window.addEventListener('resize', () => {
if (!scroll) return;
if (windowResizeTimer) clearTimeout(windowResizeTimer);
windowResizeTimer = setTimeout(() => { scroll.update(); }, 150);
});
添加回答
舉報