Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.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 在卸载之前将AJAX发送到服务器_Javascript_Jquery_Cross Browser_Onbeforeunload - Fatal编程技术网

Javascript 在卸载之前将AJAX发送到服务器

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语句中

,在卸载之前将window jQuery对象绑定到
不再有效

我想做的是提交一篇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解释器不会等待ajax
success
事件被执行,而是在卸载之前下移以完成
的执行

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版还是更高版本?