Skip to content

Commit 83aa72e

Browse files
🔒 Fix memory leak in event listener removal
Stores bound function references during initialization to properly remove event listeners when destroy() is called, preventing memory leaks caused by unbound listeners accumulating. Co-authored-by: jsem-nerad <88319121+jsem-nerad@users.noreply.github.com>
1 parent 2a7c2e2 commit 83aa72e

1 file changed

Lines changed: 20 additions & 8 deletions

File tree

src/dotwave.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,13 +241,18 @@
241241
* Add event listeners for mouse movement and window resize
242242
*/
243243
DotWave.prototype._addEventListeners = function() {
244+
this._boundMouseMove = this._handleMouseMove.bind(this);
245+
this._boundMouseEnter = this._handleMouseEnter.bind(this);
246+
this._boundMouseLeave = this._handleMouseLeave.bind(this);
247+
this._boundResize = this._handleResize.bind(this);
248+
244249
// Mouse movement listeners
245-
this.container.addEventListener('mousemove', this._handleMouseMove.bind(this));
246-
this.container.addEventListener('mouseenter', this._handleMouseEnter.bind(this));
247-
this.container.addEventListener('mouseleave', this._handleMouseLeave.bind(this));
250+
this.container.addEventListener('mousemove', this._boundMouseMove);
251+
this.container.addEventListener('mouseenter', this._boundMouseEnter);
252+
this.container.addEventListener('mouseleave', this._boundMouseLeave);
248253

249254
// Window resize
250-
window.addEventListener('resize', this._handleResize.bind(this));
255+
window.addEventListener('resize', this._boundResize);
251256
};
252257

253258
/**
@@ -574,10 +579,17 @@
574579
}
575580

576581
// Remove event listeners
577-
this.container.removeEventListener('mousemove', this._handleMouseMove);
578-
this.container.removeEventListener('mouseenter', this._handleMouseEnter);
579-
this.container.removeEventListener('mouseleave', this._handleMouseLeave);
580-
window.removeEventListener('resize', this._handleResize);
582+
if (this._boundMouseMove) {
583+
this.container.removeEventListener('mousemove', this._boundMouseMove);
584+
this.container.removeEventListener('mouseenter', this._boundMouseEnter);
585+
this.container.removeEventListener('mouseleave', this._boundMouseLeave);
586+
window.removeEventListener('resize', this._boundResize);
587+
588+
this._boundMouseMove = null;
589+
this._boundMouseEnter = null;
590+
this._boundMouseLeave = null;
591+
this._boundResize = null;
592+
}
581593

582594
// Remove canvas
583595
if (this.canvas && this.canvas.parentNode) {

0 commit comments

Comments
 (0)