onbeforeunload 在 ajax 调用中不使用 return 字符串

onbeforeunload doesn't take return string within a ajax call

我必须进行 ajax 调用并根据响应决定是否离开页面。这是我到目前为止尝试过的方法。

window.onbeforeunload = function(e) {
    $.when($.ajax({
        url: checkUrl,
        async: false,
        type: 'GET',
    })).then(function(data, textStatus, jqXHR){
        if(data===false)
            return "Appointment not created yet. Do you wish to leave?";
        else
            return false;
    });}

当我使用调试器检查控制流时,似乎要等到数据返回,但不会显示警告框。

我不确定我做错了什么。我知道有类似的问题,但找不到解决方案。帮我想办法让它工作

您没有 return 从 onbeforeunload 函数中获取字符串。您正在 return 从 then 回调中获取它。

您需要在主函数中设置一个用于 return 的变量:

window.onbeforeunload = function(e) {
    var result = undefined;
    $.when($.ajax({
        url: checkUrl,
        async: false,
        type: 'GET',
    })).then(function(data, textStatus, jqXHR){
        if(data===false) {
            result = "Appointment not created yet. Do you wish to leave?";
        }
    });
    return result;
};

旁注:不需要 $.when,您可以直接使用 $.ajax 编辑的 "promise" return:

window.onbeforeunload = function(e) {
    var result = undefined;
    $.ajax({
        url: checkUrl,
        async: false,
        type: 'GET',
    }).then(function(data, textStatus, jqXHR){
        if(data===false) {
            result = "Appointment not created yet. Do you wish to leave?";
        }
    });
    return result;
};

旁注 2:在此处插入有关同步 ajax 如何阻止浏览器 UI 的常规注释。如果您正在创建约会,当然可以在开始创建时设置一个客户端变量,然后在完成后清除它,并使用它来知道是否显示消息?

旁注 3:现代浏览器会忽略您 return 的消息,只显示一些通用的内容。我并不是说你应该改变任何东西(因为现在还有一些显示它),只是提到它所以你不会发疯试图弄清楚为什么你会收到一条消息,但不是 你的留言。

旁注 4:您的 then 回调只会接收一个参数。您列出的三个参数是传递给 success 回调的参数,而不是 then 回调。