Javascript 当用户离开(关闭)页面时,如何发送AJAX请求? 形势

Javascript 当用户离开(关闭)页面时,如何发送AJAX请求? 形势,javascript,php,jquery,ajax,forms,Javascript,Php,Jquery,Ajax,Forms,嗨, 我正在制作一个数据库驱动的游戏,其中有一个问题,如果用户找到正确的答案,他们有权更改问题(即编写一个新问题) 但这有一个重要的问题,我认为这叫做比赛条件。问题是: 用户1找到了答案 提示用户1输入新问题 在用户1提交新问题之前,用户2也会找到新答案 现在只有运气了,谁在提交新问题。如果用户2在用户1之后提交问题,则用户2的问题将覆盖用户1的问题 现在,我已经通过使用某种信号量解决了这个问题,保持了它的时间戳。总而言之,它是这样工作的: 用户1找到了答案 信号量保存到数据库中,如['u

嗨, 我正在制作一个数据库驱动的游戏,其中有一个问题,如果用户找到正确的答案,他们有权更改问题(即编写一个新问题)

但这有一个重要的问题,我认为这叫做比赛条件。问题是:

  • 用户1找到了答案
  • 提示用户1输入新问题
  • 在用户1提交新问题之前,用户2也会找到新答案
  • 现在只有运气了,谁在提交新问题。如果用户2在用户1之后提交问题,则用户2的问题将覆盖用户1的问题
现在,我已经通过使用某种信号量解决了这个问题,保持了它的时间戳。总而言之,它是这样工作的:

  • 用户1找到了答案
  • 信号量保存到数据库中,如
    ['user\u ip'='x.x','time'='y.y','locked'='true']
  • 信号量在t秒后过期
  • 只有当信号量过期时,新问题才会被接受
因此,当提交新问题时,只有当信号灯未锁定且当前时间比信号灯的日期大
t
(15)秒时,应用程序才会接受该问题

但这也有一个问题,会提示用户2

“你已经找到了答案,但是有人在你之前找到了。你可以 如果他们在15分钟内没有提交新问题,请更改问题 秒。”

因此,新的获胜者必须等待15秒,也许是不必要的

所以,

我想做什么 我想给“获胜者”提示一张带有秒表(计时器)的表格。当它达到零时,它解锁信号量,以便新的获胜者可以提交他们的问题

但这种解决方案会有以下问题:

如果胜利者在时间计数器达到零之前关闭页面,那么AJAX请求将永远不会完成,信号量将被无限期锁定

因此,我必须确保调用了
userLeave()功能

谷歌建议在卸载前使用
onbeforeuload
onunload
,但人们也抱怨这些功能不起作用。那么,如果用户(赢家)离开页面,是否有一种100%确定的方式发送此AJAX调用

如果用户(赢家)离开页面,是否有一种100%确定的方式发送此AJAX调用

您可以永远不要100%依赖客户做任何事情。想想网络连接丢失、浏览器崩溃、不可用的功能(从HTML5不兼容的浏览器到禁用的javascript)、脚本错误、配置错误的代理以意外的方式调用(或不调用)您的API,或者黑客故意这么做

你对客户的唯一期望就是他什么都不做——这被称为超时

如果希望信号量在某个时间过期,则必须创建计时器服务器端。如果您愿意,您还可以另外中止计时器,并在客户发出不打算提交答案的信号时立即过期(无论采用哪种方式)。如果您想尝试捕获关闭页面,可以从
unload
事件使用同步(A)JAX


顺便说一句:虽然我不知道你的游戏,但如果你能简单地接受这两个新问题,那会更容易,也可能会更舒服:-)

Ajax是异步的,因此是非阻塞的;页面在关闭之前不会等待它完成。正如您所想象的,如果页面关闭,代码将不再用于运行更多代码或执行请求,所有currect请求都将被取消。唯一可靠的方法是保持连接打开并尝试检测用户何时断开连接,或者执行周期性ping,或者两者兼而有之。是的,我知道这一点。但是强迫用户等待(比如“您确定要退出吗?”提示)或嵌入和隐藏的swf文件,不管怎样,我想相信有一个解决方案:)您的解决方案最有可能使用Node.JS。这样,您就可以在客户端和服务器之间创建自己的持久套接字连接。如果套接字已关闭,则可以在服务器端执行ajax调用将要处理的任何操作previously@CengizFrostclaw这种方法不仅烦人,而且不能保证。我相信这条信息可以被禁用,而且在任何情况下,如果用户只是失去了互联网连接,你都无法检测到任何东西。呵呵:)但是游戏本身是“一个问题,知道者改变它”,所以这不是一个选项。您是对的,使用免费主机的最佳选择是在服务器端处理计时。谢谢