Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript onbeforeunload不';t在ajax调用中获取返回字符串_Javascript_Jquery_Onbeforeunload - Fatal编程技术网

Javascript onbeforeunload不';t在ajax调用中获取返回字符串

Javascript onbeforeunload不';t在ajax调用中获取返回字符串,javascript,jquery,onbeforeunload,Javascript,Jquery,Onbeforeunload,我必须进行一个ajax调用,并根据响应决定是否离开页面。这是我到目前为止所做的尝试 window.onbeforeunload = function(e) { $.when($.ajax({ url: checkUrl, async: false, type: 'GET', })).then(function(data, textStatus, jqXHR){ if(data===false)

我必须进行一个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;
    });}
当我使用调试器检查控制流时,它似乎会等待数据返回,但不会显示警报框


我不确定我做错了什么。我知道也有类似的问题,但找不到解决办法。请帮助我找到一种方法使其工作

您没有从
onbeforeunload
函数返回字符串。您将从
然后
回调返回它

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

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;
};

旁注:不需要使用
$。当使用
$时,您可以直接使用
$返回的“承诺”。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
回调的参数。

可能重复@JarrodRoberson:上述参数不是异步的。遗憾的是,@JarrodRoberson:问题在于,正如T.J.Crowder在下面指出的,我无法返回onbeforeunload事件的值。感谢您的反馈。它起作用了。但它只能在IE中工作。在chrome中,如果我打开了调试器(开发人员工具),它就可以工作。关于这件事你有什么建议吗?--@T.J。Crowder@sandeep:是的:我的建议是不要尝试从
onbeforeunload
执行同步ajax。它不能跨浏览器可靠地工作,并且在ajax调用挂起时,当用户试图离开时锁定浏览器的UI是错误的。如上所述,如果您有一个正在进行的操作,那么当用户试图离开时,您可以在不进行同步ajax调用的情况下标记该操作。实际上,约会创建发生在另一个系统中,除了进行web服务调用之外,没有其他方法来确定它。是否有更好的插件来执行上述操作。谢谢你@T.J。Crowder@sandeep:在这种情况下,我可能会安排定期异步检查约会是否已创建,并将该检查的最新结果保留在变量中,该变量在
onbeforeunload
中使用。如果我使用
window.addEventListener
beforeunload
事件,则会起作用。它在所有三种浏览器中都能工作。再次感谢你的帮助!!