2011-11-05 61 views
1

我发现这种方法偶尔工作,但通常根本不起作用。如何发送窗口卸载AJAX请求,而不必等待回应

$(window).unload(function() 
{ 
    $.ajax 
    ({ 
     url: "script.php", 
     type: "POST", 
     data: 
     { 
      value: value 
     } 
    }); 
}); 

设置异步为假(即'async' : false)不得到解决的问题,并执行PHP脚本每次。但取决于脚本,它可以暂时冻结浏览器。

有没有一种很好的方式将数据发送到php脚本并让服务器在没有用户等待响应的情况下执行它?

EDIT - 我对客户端 - 服务器交互的理解很生疏,但并不是发送请求需要很长时间,而是处理请求发送的数据。我想知道如果没有用户必须在页面上进行处理。

回答

4

您需要在服务器端通过关闭连接并继续处理数据来完成此操作。在PHP它会是这个样子?

<?php 
    header("Content-Length: 0"); 
    header("Connection: close"); 
    flush(); 

//At this point the request is finished and you can continue to process the data. 
//Keep in mind the connection is now closed and you can no longer return any information to the user. 

>

注意这不是技术上发射一个后台任务,所以你应该罚款共享的主机上这样做。只要它不会持续特别长的时间。

+0

感谢您的回答。但它并没有解决问题。数据仍未保存。我还注意到,它偶尔保存在域内的链接中,但是当用户关闭窗口时,它永远不会保存。 –

+0

你还有async设置为false吗?因为如果没有,您可能会在发送所有数据之前终止请求。 –

+0

这应该强调更多,异步**需要**设置为false才能使其工作。异步请求将被浏览器的默认行为取消,因此可能会或可能无法工作。例如 - 如果服务器在浏览器刷新/关闭完成之前返回响应,则它可以工作,但大多数情况下会调用取消请求。然后这一切都取决于浏览器在这种情况下的行为 - 在我的测试中,使用FF进行的请求往往会被计算,而使用Chrome进行的请求则不会。 – eithed

0

我还没有尝试,但也许你可以添加一个超时(一个小值),或中止请求后发送它(与.abort()方法)。

1

我不会这么想。浏览器正在关闭,因此它试图关闭所有连接。我不知道如何发送请求而没有让用户等待。你几乎要求它在后台工作。

我会坚持async: false,但可能会通知用户Please wait...消息或类似消息。测试你的目标浏览器,因为它似乎有点麻烦,不能关闭浏览器/标签,并等待ajax调用完成。

+0

我对客户端 - 服务器交互的理解很生疏,但并不是发送请求需要很长时间的请求,而是处理请求发送的数据。我想知道,如果没有用户必须在页面上进行该处理 –

+0

@ user745434我会触发在您的服务器上启动后台任务的请求。这意味着服务器在响应被发送回浏览器之后会继续工作。 – Marko

+0

我会研究这个。这是一个共享主机,所以我不知道它是否可能。谢谢Marko –