jQuery Ajax 请求在没有发送的情况下被取消

IT技术 javascript jquery ajax
2021-01-22 07:54:57

我正在尝试将脚本连接到 Microsoft 的 World-Wide Telescope 应用程序。后者在端口 5050 上侦听命令。它与浏览器在同一台机器上运行(现在是 Chrome,但据我所知,Firefox 7 和 IE 9 的行为是相同的)。

我正在发送带有原始 html 文件的“Access-Control-Allow-Origin:*”标头,以尝试消除 XSS 限制作为我的问题。

我访问WWT的代码如下:

$.ajax({
    type: 'POST',
    url: url,
    data: data,
    crossDomain: true,
    success: success,
    dataType: dataType
});

在这种情况下,url 是“http://127.0.0.1:5050/layerApi.aspx?cmd=new&...”(显然...是一些附加参数的简写)。

查看 Chrome 中的网络诊断,我可以看到:

Request URL:http://127.0.0.1:5050/layerApi.aspx?cmd=new&...
Request Headersview source
Accept:application/xml, text/xml, */*; q=0.01
Content-Type:application/x-www-form-urlencoded
Origin:http://gwheeler4
Referer:http://gwheeler4/conceptconnect.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1

请求正在发出 - 我看到 WWT 创建了一个新层。但是,我没有收到回调。如果我添加了一个被调用的错误回调,但 jqXHR 对象上的错误属性只是“错误”并且状态为 0。如果我在 Chrome 中查看网络请求,我会看到“(已取消)”作为状态并且没有响应.

如果我使用相同的 URL 并将其粘贴到新的浏览器选项卡中,我可以看到响应是预期的 XML。

当然,这里的不同之处在于这是一个 GET 而不是 POST,但我已经在我的脚本中尝试过,它没有任何区别。

我对此感到非常困惑,并希望获得任何新想法。

6个回答

如果其他人遇到这个问题,我们遇到的问题是我们从链接发出 ajax 请求,而不是阻止链接被跟踪。因此,如果您在onclick属性中执行此操作,请确保也这样做return false;

@Hannele 非常感谢您分享 event.preventDefault。我非常需要它。我没有看到任何其他答案暗示这一点。您应该将此作为单独的答案发布。
2021-03-16 07:54:57
这对我也有用。谢谢。我忘记了为什么在我的 onClick 处理程序中返回 false,并将其更改为 true,阅读您的帖子后,我突然明白了。
2021-03-24 07:54:57
您还可以使用e.preventDefault();,其中eonclick事件参数。
2021-03-24 07:54:57
此外,如果您使用的是表单,则需要return falseonsubmit属性末尾添加
2021-04-01 07:54:57
@VincentClyde"return false;"告诉表单和链接中止操作。这最初用于 javascript 表单验证,如果表单无效,验证函数将返回 false,从而阻止表单提交。
2021-04-05 07:54:57

如果您使用的是 Chrome,则无法在标准 Chrome 网络面板中看到足够的信息来确定(canceled)请求的根本原因

您需要使用chrome://net-internals/#eventswhich 将向您显示您发送的请求的详细信息 - 包括有关正在发送的 cookie 的隐藏重定向/安全信息等。

例如,以下显示了我在网络跟踪中没有看到的重定向 - 由于我的 cookie 没有被跨子域发送:

t=1374052796448 [st=  1]   +URL_REQUEST_START_JOB  [dt=261]
                            --> load_flags = 143540481 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | ENABLE_LOAD_TIMING | MAYBE_USER_GESTURE | REPORT_RAW_HEADERS | VALIDATE_CACHE | VERIFY_EV_CERT)
                            --> method = "GET"
                            --> priority = 2
                            --> url = "https://...."
...
t=1374052796708 [st=261]        HTTP_TRANSACTION_READ_RESPONSE_HEADERS
                                --> HTTP/1.1 302 Moved Temporarily
                                    Content-Type: text/html
                                    Date: Wed, 17 Jul 2013 09:19:56 GMT
...
t=1374052796709 [st=262]     +URL_REQUEST_BLOCKED_ON_DELEGATE  [dt=0]
t=1374052796709 [st=262]        CANCELLED
t=1374052796709 [st=262]   -URL_REQUEST_START_JOB
                            --> net_error = -3 (ERR_ABORTED)
@BenW 谢谢,但 Firefox 对这个从 Amazon S3 提供的图像没有问题。
2021-03-14 07:54:57
我也有一个(取消的)问题。@Ben,了解这个跟踪很酷,不幸的是它没有提供任何信息。在我的情况下,服务器是 S3,我的存储桶上配置了 cors。我所做的只是对图像进行简单的 GET。我在网络面板中看到一个带有 Origin 标头的请求,但没有响应。显然 Chrome 在将请求发送到服务器之前取消了请求。没有重定向,没有 https,没有内容长度 0。整天敲我的头,仍然是个谜。
2021-04-06 07:54:57
是的。那帮助很大!
2021-04-12 07:54:57
@GeneVayngrib 尝试 Firefox - 网络调试器将直接显示更多信息 - 您或许可以在那里解决问题,然后让它在 Chrome 中运行。
2021-04-13 07:54:57

在我的情况下,type='submit'当我提交表单时,页面会在 ajax 命中之前重新加载,因此一个简单的解决方案是将type="button". 如果您不指定类型,则submit默认为默认类型,因此您必须指定type="button"

type='submit' => type='button'

或者

无类型 => type='button'

或者,如果您不想更改类型或在单击时提交表单,您可以e.preventDefault()作为第一件事 e。

<button>Submit</button>
 
<script>
$( "button" ).click(function( event ) {
  event.preventDefault();
  // AJAX Call here
});
</script>
necro 在这里发帖,起诉我 stackoverflow。我一整天都在四处寻找为什么我的请求在控制台中起作用而不是在脚本中起作用,这就是答案..谢谢!!!
2021-03-18 07:54:57
我登录并再次找到这个线程来支持这个答案!!,这很有帮助。打破了我的头几个小时
2021-03-18 07:54:57
兄弟我觉得你是上帝😍😍
2021-03-24 07:54:57
Jai shree krishna,希望它能帮助很多人。他们更早地弄清楚了。
2021-04-12 07:54:57

我有一个类似的问题。就我而言,我正在尝试在 apache 服务器 + django 上使用 Web 服务(该服务是我自己编写的)。我和你有同样的输出:Chrome 说它被取消了,而 FF 没有问题。如果我尝试直接在浏览器而不是 ajax 上访问该服务,它也可以正常工作。谷歌搜索,我发现一些较新版本的 apache 没有在响应标头中正确设置响应的长度,所以我手动执行了此操作。使用 Django,我所要做的就是:

response['Content-Length'] = len(content)

如果您可以控制您尝试访问的服务,请了解如何在您使用的平台中修改响应标头,否则您必须联系服务提供商来解决此问题。显然,FF 和许多其他浏览器能够正确处理这种情况,但 Chrome 设计者决定按规定去做。

我尝试设置 content-length 标头,但仍然存在与原始问题中描述的相同的问题。我使用的是 PHP 5.3.8 和 Apache 2.2.21(在 Windows 7 中使用 WAMP)
2021-04-06 07:54:57

我有一个类似的问题。使用 chrome://net-internals/#events 我能够看到我的问题是由于一些无声重定向。我的 get 请求在 onload 脚本中被触发。url 的格式为“ http://example.com/inner-path”,301被永久重定向到“/inner-path”。为了解决这个问题,我只是将 url 更改为“/inner-path”并解决了这个问题。我仍然不知道为什么一周前工作的脚本突然给我带来了问题......希望这对某人有所帮助