2013-02-18 59 views
8

So supposedly starting at Firefox > 4,绑定窗口jQuery对象beforeunload不再工作。将AJAX发送到服务器之前undeunload

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

当我刷新只打开的选项卡,我可以看到beforeunload事件被称为在Firefox和用下面的代码由镀铬的消息的console.log,“火狐/ NON-火狐删除”就是明证。问题是,我从来没有看到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 
} 

回答

11

Ajax是异步的。

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

当你做一个ajax请求时(由于它的异步),javascript解释器不会等待要执行的ajax success事件并向下移动完成beforeunload的执行。

success ajax应该在几秒钟后调用,但是由于页面已被刷新/关闭,所以你不会看到它。

旁注:

.success()方法已过时,并且由.done()方法代替

Reference

+0

是...我明白了非同步调用此路是我想... + 1 – cliffbarnes 2013-02-18 05:27:31

+1

@Jashwant,为explanation.Though感谢,我有证据表明,在关闭/重新打开浏览器后使用Chrome时,memcache删除成功,但它仍然是**不是用firefox删除。这里似乎还有其他的东西......将'$ .ajax'转换为同步,'async:false',有帮助吗? – 2013-02-18 05:33:47

+4

它看起来像将[$ .ajax'选项'async'更改为'false'](http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings)可以纠正问题。有没有什么理由不想这样做? – 2013-02-18 05:41:24

7

刚刚完成的缘故,这里是我做什么,感谢@Jashwant为指导: 我注意到,this other SO Q&A suggested the same solution关键是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 
} 
+1

只是为了满足我的好奇心。在Firefox检测例程(if)中,&&新数字(RegExp。$ 1)> = 4'的含义是什么(使用)?只要保证,Firefox的版本是4或更新? – trejder 2013-07-02 11:24:47

+0

是的,我会这样认为的 – 2013-07-02 12:12:22