如何在野生动物园中使用“ pagehide”事件来防止卸载?

use*_*564 5 javascript safari javascript-events reactjs

我有一个页面,在执行某些用户操作后,我会在其中发送ajax请求。重要的是要等到所有这些请求完成后,用户才能使用该页面。为此,我在ajax请求之前和之后设置一些状态var,并在“ beforeunload”事件处理程序中进行观察:

componentDidMount() {
    window.addEventListener('beforeunload', lockUnloadAction.bind(this));
}
...
export function lockUnloadAction(event) {
    let returnText = undefined;
    if (this.state.isRequestProgress) {
        // send to GA
        ....
        returnText = '?? ???????? ??? ??????????? ???????? ?????????. ' +
            '?? ???????, ??? ?????? ???? ?? ?????????';
        event.returnValue = returnText;
    }

    return returnText;
}
Run Code Online (Sandbox Code Playgroud)

但是在Safari中,beforeunload无法正常工作。根据文档https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html#//apple_ref/doc/uid/TP40006511-SW5,我应该使用'pagehide'。

但是任何确认,警报都不允许在此事件处理程序内进行(我在控制台“ window.alert不允许在卸载页面时出现错误”)。我也尝试使用preventDefault()或stopPropogation,然后发出警报或确认,我也尝试返回一些文本值并设置event.returnValue,例如“ beforeunload”事件处理程序。没有任何帮助。

componentDidMount() {
    window.addEventListener('pagehide', function(event){
        event.stopPropagation();
        event.preventDefault();
        confirm('someText');
        event.returnValue = 'someText';
        return 'someText'
    );
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以防止在safari和移动safari中卸载带有确认的页面,或者我应该以另一种方式使用“ pagehide”?

小智 2

根据这些 MDN 规范,页面隐藏事件不可取消