如何显示离开网站?仅在函数完成执行后提示卸载事件

How to show leave site? prompt in before unload event only after a function completes its execution

我必须在页面关闭事件中执行同步ajax方法,但现代浏览器不再支持在beforeunload事件中执行同步方法。

为此我已经实现了一个新的承诺,只有在 ajax 方法完成执行后才会解决,它在按钮点击时工作正常。

但是在页面beforeunload事件中,由于提示“离开站点?所做的更改可能无法保存”,函数停止执行。

当用户点击离开时,它不会被执行。

有什么建议吗?

//Index.html

<button type="button" onclick="checkAjaxWithAsync()">Check with Async</button>

//Index.js

    var isUpdated = false;

    var interval;
    var data;
    var newHandle;
    //Save report as HTML with file name...

    $(document).ready(function () {

        $(window).on("beforeunload", async function (event) {
            await checkAjaxWithAsync();
        })
    })

    
     function ajaxCall() {

        $.ajax({
            type: 'POST',
            url: '@(Url.Action("CheckAjax"))',
            async: true,
            success: function (result) {
                console.log(result)
                isUpdated = true;
                clearInterval(interval);
            },
            error: function () {
                debugger;
            }
        }).done(function () {
            console.log('After done')
        });

        console.log('After ajax');

    }

    async function checkAjaxWithAsync() {
        isUpdated = false;
        await processFunction();
        console.log('is updated:',isUpdated)
        console.log('Hi From Do IT')
    }

    async function waitUntil() {
        return await new Promise(resolve => {
            const interval = setInterval(() => {
                if (isUpdated) {
                    resolve('completed');
                    clearInterval(interval);
                };
            }, 1000);
        });
    }

    async function processFunction() {
        
        ajaxCall();
        await waitUntil()
        
        console.log('after interval')
    }

//HomeController.cs


public class HomeController : Controller
    {
        
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public string CheckAjax(object data)
        {
            System.Threading.Thread.Sleep(1000 * 10);
            return "Hello";
        }
    }

根据您的描述,恐怕这个需求是无法实现的。因为这是内置行为,旨在仅允许出于安全目的进行非常小的更改。

beforeunload 的主要目的是允许用户选择在更改丢失之前保存更改。