Javascript onbeforeunload不';t在ajax调用中获取返回字符串
我必须进行一个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)
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
事件,则会起作用。它在所有三种浏览器中都能工作。再次感谢你的帮助!!