onbeforeunload不会在ajax调用中获取返回字符串

时间:2016-07-18 17:23:01

标签: javascript jquery onbeforeunload

我必须进行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;
    });}

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

我不确定我做错了什么。我知道有类似的问题,但找不到解决方案。帮我找到一种方法让它发挥作用

1 个答案:

答案 0 :(得分:0)

您没有从onbeforeunload函数返回字符串。您是从then回调中返回的。

您需要设置一个用于从主函数返回的变量:

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返回的“承诺”:

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:现代浏览器会忽略您返回的消息,只显示通用内容。我不是说你应该改变任何东西(因为现在还有一些东西可以显示),只是提到它所以你不要试图找出你收到消息的原因,但不是你的消息。

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