我有一个带有AJAX购物车的网站。这个概念非常简单:您最终会在包含产品的页面上点击Buy Now
按钮。执行此操作时,JavaScript代码会将产品添加到购物车,使用新计数更改购物车视觉效果,并向服务器发送AJAX请求以报告更改。
我想知道的是,因为客户端和服务器可能需要一段时间才能处理AJAX请求,所以......客户端会在点击链接之前移动到另一个页面(即“下一个产品”)据报道AJAX成功停止了AJAX请求?
// prepare request...
...snip...
// send request (usually a POST)
jQuery.ajax(uri, ajax_options);
// return to user
// will a click on a link cancel the AJAX call after this point?
此外,我有定时的AJAX请求。如果用户在这些定时请求发生之前点击链接,那么它们肯定会丢失。假设点击不会取消AJAX请求,那么会在unload
事件中启动吗?使用cookie比尝试另一个AJAX请求更好/更安全吗? (尽管如果用户点击外部链接,unload
实际上是我能想到的唯一保存数据的解决方案......)
作为旁注:当用户将项目添加到购物车时,我不想让屏幕变暗,这样用户可以继续做事......但是如果需要在链接之前确认AJAX点击,我必须确保在此之前不能使用点击。
更新
我认为你们中的一些人错过了这一点。我不关心在客户端调用的done()
或completed()
函数。我所关心的是确保最终得到服务器上的所有数据。
我知道这是异步的,但我想确保的是避免数据丢失,特别是如果链接转到另一个网站(到同一个网站,我真的想利用cookie来确保无论如何,延迟的AJAX请求的数据都会到达服务器。)
此外,定时数据请求的想法是避免服务器上的负载过重。通过适当的定时AJAX请求集,客户端和服务器都可以更好地工作!
答案 0 :(得分:4)
@meagar在评论中很好地总结了这一点
当浏览器离开页面时,任何待处理的AJAX请求都将被中止。
因此,根据您定义“杀死”AJAX请求的方式,这意味着可以启动请求,但也可能尚未完成。如果这是一个简短的请求,很可能它不会在它完成时中止。但如果这是一个很长的请求(大量的数据处理,需要一两秒才能完成),那么很可能它会在中间的某个地方中止。
当然,这完全取决于浏览器。问题通常是请求将其发送到服务器,但浏览器在响应通过之前中止请求。这一切都取决于服务器及其处理数据的方式。
视图的某些服务器will interrupt the execution,正在处理请求数据并生成响应。许多服务器只是让代码运行并在try to write output to the response时触发错误。这是因为是另一端没有人,所以你要将响应写入已关闭的连接。
虽然如果用户点击外部链接,
unload
实际上是我能想到保存该数据的唯一解决方案
根据我自己的经验,大多数浏览器都允许您在beforeunload
事件期间发出请求。但unload
并非总是这样,因为当时页面会更改cannot typically be stopped。
解决此问题的一种方法,特别是在响应很重要时,是在用户单击链接后停止页面更改。这可以像在链接的evt.preventDefault()
事件上调用click
一样简单,然后在请求完成时将用户重定向到他们想要去的地方。您应该确保向用户表明他们的请求并未被忽略,但他们正在等待某些事情先完成。用户不希望被置于黑暗中,因此请务必向他们提供一些反馈(例如更改按钮文本,禁用它等)。