const INTERVAL_TIME = 100; export class UrlController { constructor() { this._changeListeners = []; this._interval = null; this._url = window.location.href; } onChange(cb) { this._changeListeners.push(cb); if (this._interval === null) { this._createInterval(); } } removeEventListener(cb) { this._changeListeners = this._changeListeners.filter(item=>item !== cb); if(this._changeListeners.length === 0) { this._clearInterval(); } } _intervalTick() { const currentUrl = window.location.href; if (currentUrl !== this.url) { this._broadcast(this.url, currentUrl); this.url = currentUrl; } } _broadcast(oldUrl, newUrl) { this._changeListeners.forEach(cb => cb(oldUrl, newUrl)); } _createInterval() { this.interval = setInterval(() => this._intervalTick(), INTERVAL_TIME) } _clearInterval() { clearInterval(this.interval) this.interval = null } }