2017-06-09 1 views
2

Je souhaite inviter les utilisateurs à confirmer avant de quitter une page.Comment empêcher la double confirmation en chrome avec les événements 'onbeforeunload' en cours de réaction

J'ai ajouté et écouteur d'événement dans componentDidMount:

componentDidMount() { 
    window.addEventListener('beforeunload', this.onUnload) 
} 

Puis je l'ai écrit l'événement que je veux arriver:

onUnload(e) { 
    var message = "Random message to trigger the browser's native alert." 
    e.returnValue = message 
    return message 
    } 

Puis-je lié l'événement dans le constructeur:

constructor(props) { 
    super(props) 
    this.onUnload = this.onUnload.bind(this) 
    } 

Et finalement j'ai enlevé l'écouteur d'événement sur démonter:

componentWillUnmount() { 
    window.removeEventListener('beforeunload', this.onUnload) 
    } 

Tout semble fonctionner correctement. Je reçois le message suivant quand je tente de fermer l'onglet en chrome: enter image description here

Le problme est que je reçois aussi une invite de reload après avoir choisi l'une des options: enter image description here

Comment puis-je me débarrasser de la deuxième invite? Qu'est-ce que je fais mal?

+0

Et si vous mettez le 'removeEventListener' dans' onUnload'? 'componentWillUnmount' pourrait ne pas être appelé dans votre cas. – DonovanM

+0

@DonovanM Je viens de lui donner un coup de feu et pas de chance. Même comportement qu'avant. Je suppose que vous vouliez dire ... 'onUnload (e) { e.preventDefault(); var message = "Message aléatoire pour déclencher l'alerte native du navigateur."; e.returnValue = message; renvoyer un message; window.removeEventListener ('beforeunload', this.onUnload); } 'J'ai jeté un journal de console dans unmount pour tester votre point et il semble être en train de tirer. Merci quand même. Je vous en suis reconnaissant. –

+1

'window.removeEventListener' devrait être avant' return message'. Tout ce qui suit une déclaration de retour ne sera pas exécuté. Mais puisque vous avez dit démonter est tirant correctement cela ne va probablement pas aider beaucoup, malheureusement :( – DonovanM

Répondre

1

Vous pouvez déplacer window.removeEventListener la méthode onUnmount pour vous assurer qu'elle est appelée. Donc quelque chose comme ceci devrait fonctionner:

onUnload(e) { 
    window.removeEventListener('beforeunload', this.onUnload) 

    var message = "Random message to trigger the browser's native alert." 
    e.returnValue = message 
    return message 
} 
0

essayer d'ajouter e.preventDefault() dans onUnload

+0

Unfortunatley pas.! Même problème, merci cependant 'onUnload (e) { e.preventDefault(); var message = "Message aléatoire pour déclencher l'alerte native du navigateur."; e.returnValue = message; renvoyer un message; } ' –