AJAX – 在用户更改页面后接收响应

我知道的:
当我对我的服务器进行ajax调用时,会创建一个处理程序,发送请求,我的php脚本接收请求并处理它 – 如果我告诉它 – 发回一个响应,我的javascript解析为要求。 我也知道即使用户关闭浏览器或更改页面,php也会继续处理请求(这一切都在服务器端完成,所以为什么不呢?^。^)。

我需要知道的是:
当用户更改我的网站中的页面时,ajax处理程序是否被杀死? 例如:用户在mysite.com/foo.php上。 他们单击一个向我的服务器发送ajax请求的链接。 该请求的响应将显示在foo.php上的div#resp中。 然后他们会在收到回复之前导航到mysite.com/bar.php。

如果我加载相同的javascript函数并在bar.php上有所需的div#resp元素,那么调用ajax的javascript函数仍然可以从服务器接收响应并将其传递给bar.php上的div#resp,从而显示响应? 或者原来的ajax手柄不再可用? 如果它在标准的javascript中不再可用,那么jQuery中是否有一些植入可以让我检索响应并在bar.php上显示它?

根据您的描述,不 – 一旦您导航到另一个页面并导致页面重新加载,您的所有javascript处理程序都会重新实例化并且原始的处理程序被破坏。

答案是不。 当您更改页面时,javascript进程将被终止并重新启动。 页面重新加载之间没有任何内容。

虽然,如果您的页面也在ajax中更改,那么该进程不会被终止,您可以收到响应。 (顺便说一句,在最近的浏览器中,这可以通过PushState与最终用户PushState无缝)

不,您不能保证在用户导航到下一页之前回复您的XHR(AJAX)响应。

如果您希望能够检测到服务器端,当用户离开您的页面时,您将不得不使用WebSocket或类似的技术。 WebSocket连接是与外部主机的长期连接,您可以在切断时轻松检测到服务器端。 https://github.com/sockjs是WebSocket客户端+服务器的示例。

如果您只想在用户导航离开页面之前向用户显示内容,则需要查看window.onbeforeunload – onbeforeunload在用户离开页面之前触发,但不允许您执行任何异步AJAX请求。 有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/window.onbeforeunload

如果您想这样做,请构建“单页Web应用程序”。 简单明了,不要找到新的url。

相反,使用pushstate / popstate更改浏览器中的地址,然后使用javascript / dynamic html重绘页面。

然后,您可以处理所有ajax响应。

另一个选择是有一个onload事件,它向服务器发出一个ajax请求,并询问是否需要做某些事情。 服务器需要跟踪“事物”并让浏览器知道发生了什么。

基本上,浏览器将在每个页面的开头轮询服务器。

我不认为代码示例是必要的或适用的,因为它会因每个应用程序而异。

您可以在收到值时将值保存到localStorage,也可以在会话,内存缓存或redis中保存所有ajax数据响应。 这意味着如果服务器收到请求,那么它会先将响应保存到某处,然后再返回。 从列表中删除消息/响应取决于您的具体情况。 某些系统允许您关闭其他人在用户第一次看到它们后消失的通知。 消失的是不稳定的。 用户可能会或可能不会真正看到它。

这听起来像是各种图书馆的“flash信息”。 您可能希望查看这些系统的实现。

虽然原始接受的响应是正确的 – 一旦您导航到另一个页面,您就无法收到对ajax请求的响应 – 有一种解决方法:如果您将网站设为单页应用程序,您将能够获得响应。

我的一个项目也有同样的情况。 要在页面之间存在一些瞬态,您必须拥有从一个页面到另一个页面的内容。 最简单的用法是PHP会话(我看到你使用PHP)。 很简单,您可以在每个页面上加载异步请求(Ajax),如果有活动已启动,将在服务器上检查(使用PHPSESSID)。 您可以选择检查每个页面加载(在docready上)或间隔。

当然,如果用户关闭浏览器选项卡,您将丢失所有内容。

如果您通过简单的HTTP POST使用所有AJAX调用,那么所有AJAX调用都不会出现在页面上

HTTP请求的生命周期通常如下所示:

用户访问网站的URL。 这创建了一个请求,该请求通过HTTP(超文本传输​​协议)经由因特网(DNS,路由器和交换机的网络)路由到Web服务器。 Web服务器接收HTTP请求并使用请求的Web页面(或内容)响应用户。 每次单击链接并访问网页时,您都会在幕后发出请求,然后从Web服务器接收响应。 请注意,HTTP请求可以通过许多渠道进行,而不仅仅是网络浏览器。 例如,可以使用TELNET或用JAVA或C#等编写的客户端发出HTTP请求。

所以你必须为此使用套接字,以便可以调整http的生命周期。

http://devhub.fm/http-requestresponse-basics/