Jquery 如何在窗口卸载时发送AJAX请求而不必等待响应

Jquery 如何在窗口卸载时发送AJAX请求而不必等待响应,jquery,ajax,Jquery,Ajax,我发现这种方法偶尔有效,但通常根本不起作用 $(window).unload(function() { $.ajax ({ url: "script.php", type: "POST", data: { value: value } }); }); 将async设置为false(即'async':false)确实可以解决问题,并且每次都执行php脚本。但根据脚本

我发现这种方法偶尔有效,但通常根本不起作用

$(window).unload(function()
{
    $.ajax
    ({
        url: "script.php",
        type: "POST",
        data: 
        { 
            value: value
        }
    });
});
将async设置为false(即
'async':false
)确实可以解决问题,并且每次都执行php脚本。但根据脚本的不同,它可能会暂时冻结浏览器

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


编辑-我对客户机-服务器交互的理解有些生疏,但不是发送请求需要很长时间,而是处理请求发送的数据。我想知道是否可以在用户不必出现在页面上的情况下进行处理。

我没有尝试过,但是您可以添加一个超时(使用较小的值),或者在发送请求后立即中止请求(使用.abort()方法)。

我没有尝试过,但是您可以添加一个超时(使用较小的值),或者在发送请求后立即中止请求(使用.abort()方法)。

我不这么认为。浏览器正在关闭,因此它正在尝试关闭所有连接。我不知道它如何在不让用户等待的情况下发送请求。你几乎要求它在后台工作


我会坚持使用
async:false
,但可能会用
请稍候…
消息或类似消息通知用户。在您的目标浏览器中也进行测试,因为它看起来有点麻烦,无法关闭浏览器/选项卡并等待ajax调用完成。

我不这么认为。浏览器正在关闭,因此它正在尝试关闭所有连接。我不知道它如何在不让用户等待的情况下发送请求。你几乎要求它在后台工作


我会坚持使用
async:false
,但可能会用
请稍候…
消息或类似消息通知用户。在目标浏览器中也进行测试,因为这看起来有点麻烦,无法关闭浏览器/选项卡并等待ajax调用完成。

您需要在服务器端通过关闭连接然后继续处理数据来完成此操作。在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.


请注意,从技术上讲,这并不是启动后台任务,所以在共享主机上执行此操作应该没问题。只要它不会挂起很长一段时间。

您需要在服务器端关闭连接,然后继续处理数据来完成此操作。在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.


请注意,从技术上讲,这并不是启动后台任务,所以在共享主机上执行此操作应该没问题。只要它不会挂起很长一段时间。

我对客户机-服务器交互的理解已经过时了,但不是发送请求需要很长时间,而是处理请求发送的数据。我想知道,如果用户不必在页面上all@user745434我会发出一个请求,在您的服务器上启动后台任务。这意味着服务器将在响应发送回浏览器后继续执行其工作。我将对此进行研究。这是一个共享主机,所以我不知道这是否可能。谢谢Marko@user745434不用担心,我对PHP不太熟悉,所以在这个话题上我帮不上忙,但如果你找不到你想要的东西,也许值得开始一个新问题(例如,如何在共享主机上运行后台任务?)。我对客户机-服务器交互的理解有些生疏,但不是请求发送需要很长时间,它是对请求发送的数据的处理。我想知道,如果用户不必在页面上all@user745434我会发出一个请求,在您的服务器上启动后台任务。这意味着服务器将在响应发送回浏览器后继续执行其工作。我将对此进行研究。这是一个共享主机,所以我不知道这是否可能。谢谢Marko@user745434不用担心,我对PHP不太熟悉,所以在这个话题上我帮不上忙。如果你找不到你想要的东西,也许值得开始一个新问题(例如,如何在共享主机上运行后台任务?),谢谢你的回答。但这并没有解决问题。数据仍然没有保存。我还注意到,它偶尔会与域内的链接一起保存,但当用户关闭窗口时,它永远不会保存。您是否仍将async设置为false?因为如果不是,您可能会在发送所有数据之前终止请求。这应该更加强调,异步需要设置为false才能工作。异步请求将被浏览器默认行为取消,因此它可能工作,也可能不工作。例如,如果服务器在浏览器完成刷新/关闭之前返回响应,它可以工作,但大多数情况下会调用取消请求。在这种情况下,这完全取决于浏览器的行为——在我的测试中,使用FF完成的请求往往会被计算在内,而使用Chrome完成的请求则不会被计算在内。谢谢你的回答。但这并没有解决问题。数据仍然没有保存。我还注意到,它偶尔会与域内的链接一起保存,但当用户关闭窗口时,它永远不会保存。您是否仍将async设置为false?因为如果不是,您可能会在发送所有数据之前终止请求。这应该更加强调,异步需要设置为false才能工作。异步请求将被浏览器默认行为取消,因此它可能工作,也可能不工作。例如,如果服务器在浏览器完成刷新/关闭之前返回响应,它可以工作,但大多数情况下会调用取消请求。那么,这一切都取决于浏览器在这种情况下的行为