Javascript 在卸载之前将AJAX发送到服务器
,在卸载之前将window jQuery对象绑定到Javascript 在卸载之前将AJAX发送到服务器,javascript,jquery,cross-browser,onbeforeunload,Javascript,Jquery,Cross Browser,Onbeforeunload,,在卸载之前将window jQuery对象绑定到不再有效 我想做的是提交一篇AJAX文章来删除服务器的memcache数据 当我刷新唯一打开的选项卡时,我可以看到在firefox和chrome中都调用了beforeunload事件,下面的代码由console.log消息“firefox/NON-firefox delete”证明。问题是我从未看到console.log消息“memcache delete”,表明我的服务器从未看到$.ajax请求 我意识到浏览器嗅探是不好的,if和else语句中
不再有效
我想做的是提交一篇AJAX文章来删除服务器的memcache数据
当我刷新唯一打开的选项卡时,我可以看到在firefox和chrome中都调用了beforeunload
事件,下面的代码由console.log消息“firefox/NON-firefox delete”证明。问题是我从未看到console.log消息“memcache delete”,表明我的服务器从未看到$.ajax
请求
我意识到浏览器嗅探是不好的,if和else语句中包含的内容没有区别。我只是展示我在Firefox中尝试过但失败的代码
有人有什么想法吗
$(window).bind('beforeunload', function(){
if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) {
console.log('firefox delete');
memcacheDelete();
return null;
}
else {
console.log('NON-firefox delete');
memcacheDelete();
return null;
}
});
function memcacheDelete() {
$.ajax({
url: "/memcache/delete",
type: "post",
data:{},
success:function(){
console.log('memcache deleted');
}//success
}); //ajax
}
Ajax是异步的。
刷新(或关闭)浏览器时,将调用beforeunload
。这意味着,在卸载之前,一旦完成执行,页面就会刷新(或关闭)
当您执行ajax请求时,(因为它是异步的),javascript解释器不会等待ajaxsuccess
事件被执行,而是在卸载之前下移以完成的执行
ajax的success
应该在几秒钟后调用,但您不会看到它,因为页面已经刷新/关闭
旁注:
.success()
为了完成,我做了以下几点,感谢@Jashwant的指导:
我注意到了。
关键是$中的async:true(false)
$(window).bind('beforeunload', function(){
if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) {
console.log('firefox delete');
var data={async:false};
memcacheDelete(data);
return null;
}
else {
console.log('NON-firefox delete');
var data={async:true};
memcacheDelete(data);
return null;
}
});
function memcacheDelete(data) {
$.ajax({
url: "/memcache/delete",
type: "post",
data:{},
async:data.async,
success:function(){
console.log('memcache deleted');
}//success
}); //ajax
}
是的…我理解异步调用的方式就是我所想的+1@Jashwant,谢谢你的解释。虽然我有证据表明,在关闭/重新打开浏览器后使用Chrome时,memcache删除成功,但它仍然没有使用firefox删除。这里似乎发生了其他事情..将$.ajax
转换为同步,async:false
,是否有帮助?看起来更改可以解决问题。有什么理由不想这样做吗?通常ajax是真的
,因为我们不想等到ajax完成。如果将async
设置为false
,则ajax调用后的javascript代码将在服务器响应之前执行。具体来说,我认为刷新/关闭可能需要几秒钟(直到ajax完成)是的。所有选项都是为了开发人员。用一个适合你的:)只是为了满足我的好奇心。在Firefox检测例程(if)中,&&newnumber(RegExp.$1)>=4
的含义(用法)是什么?只是想确保Firefox是4版还是更高版本?