2017-06-09 17 views
2

ページを離れる前に確認を求めます。反応の 'onbeforeunload'イベントでクロムの二重確認を防止するには

componentDidMountで 私は追加

とイベントリスナー:

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

は、それから私は私が起こるしたいイベントを書きました:

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

その後、私はコンストラクタでイベントをバインド:

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

最後に、アンマウント時にイベントリスナーを削除しました:

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

すべてうまくいくようです。私がしようとクロムでタブを閉じるとき、私は次のプロンプトを取得します: enter image description here

私はを取り除くにはどうすればよい: enter image description here

problmeは、私はどちらかのオプションを選択した後、私はまた、リロードプロンプトを取得していることです2番目のプロンプト?私は間違って何をしていますか? e.preventDefaultを(追加

+0

'removeEventListener'を' onUnload'に入れるとどうなりますか?あなたのケースでは 'componentWillUnmount'が呼び出されないかもしれません。 – DonovanM

+0

@DonovanM私はちょうどそれにショットと運を与えた。前と同じ動作。私はあなたが意味すると仮定します... onUnload(e){ e.preventDefault(); var message = "ブラウザのネイティブアラートをトリガーするランダムメッセージです。"; e.returnValue = message; 返信メッセージwindow.removeEventListener( 'beforeunload'、this.onUnload); } 'コンソールログをunmountに投げてあなたのポイントをテストしましたが、それは発砲しているようです。ありがとう、結構です。それは有り難いです。 –

+1

'window.removeEventListener'は' return message'の前になければなりません。 return文の後のものは実行されません。しかし、あなたがアンマウントが正しく発射していると言いましたので、残念ながら、これはあまり役に立たないでしょう:( – DonovanM

答えて

1

にあなたはそれが呼び出されることを確認するためにonUnmount方法にwindow.removeEventListenerを移動することができます。だから、このようなものがうまくいくはずです:

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

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

TRY)ONUNLOAD

+0

Unfortunatleyない。 VARメッセージ=「ブラウザのネイティブのアラートをトリガーするランダムメッセージ。」; e.returnValue =メッセージ; リターン・メッセージ。! 。同じ問題。ありがとう。 'onUnload(e) { e.preventDefault(); var message = "ブラウザのネイティブアラートをトリガーするランダムメッセージです。"; e.returnValue = message; 返信メッセージ } ' –

関連する問題