Estoy tratando de eliminar el evento usando window.removeEventListener que he agregado usando window.addEventListener para el evento beforeunload pero no se elimina. Estoy tratando de seguir el código
addAlertWithListener(){ window.addEventListener('beforeunload', (event) => { // Cancel the event as stated by the standard. event.preventDefault(); // Chrome requires returnValue to be set. event.returnValue = 'You are currently in edit mode. Are you sure you want to refresh the page?'; },true); }Se está agregando, pero cuando intento eliminar la misma función usando el siguiente código:
removeAlertWithListener() { window.removeEventListener('beforeunload', null,true); }Todavía da mensaje de alerta. ¿Me estoy perdiendo algo aquí? Probé con y sin el último parámetro. Ninguna de las cosas parece funcionar aquí.
addEventListener y removeEventListener se implementan de una manera extraña en JavaScript, necesitan exactamente los mismos parámetros para recuperar los oyentes registrados. Eso es diferente de setTimeout donde se devuelve una identificación.
En Angular, generalmente hago algo como esto:
private readonly BEFORE_UNLOAD_PARAMS = ['beforeunload', (event) => ..., true]; private isBeforeUnloadActive: boolean = false; addAlertWithListener() { if (this.isBeforeUnloadActive) return; window.addEventListener(...this.BEFORE_UNLOAD_PARAMS); this.isBeforeUnloadActive = true; } removeAlertWithListener() { window.removeEventListener(...this.BEFORE_UNLOAD_PARAMS); this.isBeforeUnloadActive = false; }La bandera evitará que el oyente se registre dos veces