7

我所知道的:
当我对我的服务器进行 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 上?

4

9 回答 9

7

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

于 2012-10-06T02:03:05.693 回答
5

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

虽然,如果您的页面也在 ajax 中发生变化,那么该进程不会被终止,并且您可以收到响应。PushState(顺便说一句,对于使用最新浏览器的最终用户来说,这几乎可以无缝连接)

于 2012-10-06T02:01:59.453 回答
2

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

如果您希望能够在服务器端检测用户何时离开您的页面,则必须使用 WebSocket 或类似技术。WebSocket 连接是到外部主机的长时间运行的连接,当它被切断时,您可以轻松地检测到服务器端。https://github.com/sockjs是一个 WebSocket 客户端 + 服务器的例子。

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

于 2013-09-23T05:28:04.633 回答
1

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

而是使用pushstate/popstate在浏览器中更改地址,然后使用javascript/动态html重绘页面。

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

于 2013-09-24T02:06:20.423 回答
1

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

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

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

于 2013-09-24T02:12:39.690 回答
0

只要您离开页面,如果通过简单的 HTTP POST 使用该页面,所有 AJAX 调用都将不可用

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

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

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

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

于 2013-09-24T09:02:58.337 回答
0

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

于 2013-09-23T00:16:01.467 回答
0

我在我的一个项目中遇到了同样的情况。要在页面之间有一些短暂的东西,你必须让你从一页到另一页识别出一些东西。最简单的使用方法是 PHP 会话(我看到你使用 PHP)。很简单,您可以在每个页面上加载一个异步请求(Ajax),如果有活动启动,它将检查服务器(使用 PHPSESSID)。您可以选择检查每个页面加载(在 docready 上)或间隔检查。

当然,如果用户关闭浏览器选项卡,您将失去一切。

于 2013-09-23T15:50:30.663 回答
0

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

这听起来像是来自各种图书馆的“闪光信息”。您可能想查看这些系统的实现。

于 2013-09-18T17:33:22.823 回答