11

所以据说从 Firefox > 4 开始,将窗口 jQ​​uery 对象绑定到beforeunload不再起作用。

我想做的是提交一个 AJAX 帖子来删除我服务器的内存缓存数据。

当我刷新唯一打开的选项卡时,我可以看到beforeunload在 firefox 和 chrome 中都使用以下代码调用了该事件,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
}
4

2 回答 2

11

Ajax 是异步的。

当您刷新(或关闭)浏览器时,beforeunload正在调用。这意味着一旦beforeunload完成执行,页面将刷新(或关闭)。

当您执行 ajax 请求时,(因为它是异步的)javascript 解释器不会等待 ajaxsuccess事件被执行,而是向下移动完成beforeunload.

successajax 应该在几秒钟后被调用,但你看不到它,因为页面已被刷新/关闭。

边注:

.success()方法已弃用并由.done()方法替换

参考

于 2013-02-18T05:25:29.650 回答
8

只是为了完成,这就是我所做的,感谢@Jashwant 的指导:我注意到这个其他 SO Q&A 提出了相同的解决方案关键是在下面async:true(false)$.ajax调用中:

$(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
}
于 2013-02-18T06:14:41.737 回答