【问题标题】:jQuery POST waits for response before processing user interaction with anchorsjQuery POST 在处理用户与锚点的交互之前等待响应
【发布时间】:2019-07-28 21:44:38
【问题描述】:

假设我有一个简单的 jQuery POST 脚本:

$(document).ready(function () {
    $.post("post-data.php")
        .done(function (data) {
            // Done function
        }).fail(function () {
            // Fail function
        });
});

假设我有这个 HTML:

<div id="page">
    <a href="link.php">Some link</a>
    <div id="jquery-data-response"></div>
</div>

如果 post-data.php 在 10 秒后返回数据,而我在 10 秒内点击“Some link”,则在 jQuery POST 请求完成后会加载页面“link.php”,因此用户必须等待最多 10 秒。

这也适用于 jQuery GET 请求。

现在我有两个问题。

  1. 问题出在哪里?是服务器问题(假设脚本已经完全优化并且不能超过 10 秒,它也发生在带有 XAMPP 的 localhost 上)、jQuery 问题(缺少处理用户交互的函数?)还是浏览器问题(Chrome 是否必须等待所有请求都得到处理?)?
  2. 是否有可能解决这个问题(以及如何解决)?

【问题讨论】:

    标签: php jquery post


    【解决方案1】:

    问题出在哪里?

    当前的问题是如何独立于请求管理交互。如果您不希望有人在请求完成之前点击链接,那么您应该对其进行管理,直到它完成为止。

    例如,在您的代码中声明一个标志,以确定您的请求是否已得到解决。默认为false。然后运行您的 ajax 查询。成功后,它会将requestComplete 设置为true

    let requestComplete = false;
    
    $.post("post-data.php")
      .done(function (data) {
        // this will prompt your listener to allow native execution
        requestComplete = true;
      })
      .fail(function () { ... });
    

    将侦听器绑定到您的链接,该侦听器仅在标志为true 时才允许交互。事件处理程序的返回值决定了默认浏览器行为是否也应该发生。在点击链接的情况下,这将跟随链接。

    $(document).on('click', '.link', function (event) {
      return requestComplete;
    });
    

    因此您的标记将如下所示:

    <div id="page">
      <a href="link.php" class="link">Some link</a>
      <div id="jquery-data-response"></div>
    </div>
    

    要演示阻止浏览器默认行为,请探索this fiddle

    【讨论】:

    • 感谢您的解释和示例!我自己的例子不够清楚。它是关于获取数据而不是发布数据(只是在我们的服务器上将其更改为 GET),我们希望允许用户导航到不同的页面,即使服务器尚未响应)。这可能吗?
    • 是的,你给出的例子是可能的。您有一个链接,并且您正在后台执行 POST/GET 请求。用户仍然可以单击链接并导航。但是你到底想达到什么目的呢?
    • 问题在于,在目前的情况下,用户必须等待 GET 请求完成。如果用户点击一个链接并且 GET 请求仍在进行中,浏览器会一直加载直到 GET 请求完成。
    • 您是否在 php 脚本中使用会话?我问只是因为我认为这是服务器端问题,而不是客户端问题。您无法导航到另一个页面,因为 php 可能被锁定在某个状态并正在等待释放,然后才能处理下一个请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2016-08-04
    • 2011-01-12
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多