javascript - 单击链接时 AJAX 请求是否被终止?

标签 javascript jquery ajax

我有一个带有 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 请求,客户端和服务器都可以更好地工作!

最佳答案

@meagar在评论中总结得很好

Any pending AJAX requests will be aborted when the browser navigates away from the page.

因此,根据您定义“终止”AJAX 请求的方式,这意味着请求可能已开始,但也可能尚未完成。如果它是一个简短的请求,很可能它在完成时不会被中止。但如果这是一个很长的请求(大量数据处理,需要一两秒钟才能完成),那么它很可能会在中间的某个地方被中止。

当然,这完全取决于浏览器。问题通常是请求发送到服务器,但浏览器在响应通过之前中止了请求。这完全取决于服务器及其处理数据的方式。

一些服务器will interrupt the execution在您看来,正在处理请求数据并生成响应。当您 try to write output to the response 时,许多服务器只会让代码运行并触发错误.这是因为另一端没有人,所以您正在编写对已关闭连接的响应。

although if the user clicks an external link, the unload is really the only solution I can think of to save that data

根据我自己的经验,大多数浏览器都允许您在 beforeunload 事件期间发送请求。不过,对于 unload 来说,这并不总是正确的,因为那时页面会更改 cannot typically be stopped .

解决此问题的一种方法是在用户单击链接后停止页面更改,尤其是在响应很重要的情况下。这可以很简单,只需在链接的 click 事件上调用 evt.preventDefault(),然后在收到请求时将用户重定向到他们想去的地方完成的。您应该确保向用户表明他们的请求不仅被忽略了,而且他们正在等待某些事情先完成。用户不想被蒙在鼓里,所以一定要给他们一些反馈(比如更改按钮文本、禁用按钮等)。

关于javascript - 单击链接时 AJAX 请求是否被终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27894448/

相关文章:

javascript - 在javascript中解析粘在一起的json

javascript - 如何在没有 JQuery 的情况下检查元素是否是最后一个子元素

javascript - 在按钮 onclick 事件后禁用整个 DIV 标签和里面的所有内容

javascript - Ajax(过滤器)加载后加载 jQuery 脚本

php - Ajax执行php而不刷新-如何设置变量?

php - 我想要一个分页到我的 wordpress 插件选项页面?

javascript - 除了可扩展性之外,还有哪些使用 node.js 的架构原因?

javascript - 使用 JavaScript splice/indexOf 从数组中删除项目

jquery 选择器

jquery - Opera - 防止输入有焦点