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

时间:2011-09-28 01:05:00

标签: javascript jquery ajax

我正在尝试将脚本连接到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,但我在我的脚本中尝试过它并没有区别。

我对此感到非常难过,并会欣赏任何新鲜的想法。

17 个答案:

答案 0 :(得分:130)

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

答案 1 :(得分:107)

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

您需要使用chrome://net-internals/#events,它会向您显示您要发送的请求的详细信息 - 包括有关发送Cookie的隐藏重定向/安全信息等。

e.g。以下显示了我在网络跟踪中没有看到的重定向 - 由于我的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)

答案 2 :(得分:12)

在我的情况下,我有driver.switchTo().defaultContent(); 所以当我提交表单时,页面在ajax命中之前重新加载,所以一个简单的解决方案就是kubectl logs {podname}

<强>类型=&#39;提交&#39; =&GT;类型=&#39;按钮&#39;

答案 3 :(得分:6)

我有类似的问题。就我而言,我正在尝试在apache服务器+ django上使用Web服务(该服务由我自己编写)。我输出的输出与你相同:Chrome表示它已被取消,而FF则可以。如果我试图直接在浏览器而不是ajax上访问该服务,它也会起作用。 谷歌搜索,我发现一些较新版本的apache没有在响应头中正确设置响应的长度,所以我手动完成了这个。有了django,我所要做的就是:

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

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

扩展@ Kazetsukai的答案,如果您从用户点击链接发出AJAX请求,则可能会遇到此问题。

如果你这样设置你的链接:

<a href="#" onclick="soAjax()">click me!</a>

然后是一个javascript处理程序,如下所示:

soAjax() {
    $.ajax({ ... all your lovely parameters ... });       
}

要阻止您的浏览器关注该链接并取消正在进行的任何请求,您应添加return falsee.preventDefault()以阻止点击事件传播:

soAjax() {
   $.ajax({ ... etc ... });
   return false;
}

或者:

soAjax(e) {
   $.ajax({ ... etc ... });
   e.preventDefault();
}

答案 6 :(得分:2)

(使用Web窗体ASP.NET)

我的问题是我试图从提交服务器端点击事件设置的提交按钮的点击事件中解除Ajax。我不得不将按钮设为一个简单的按钮(即<input type="button">

答案 7 :(得分:2)

我遇到了同样的问题,对于我来说,我是以临时方式创建iframe而我在ajax完成之前删除了iframe,因此浏览器会取消我的ajax请求。

答案 8 :(得分:1)

我在使用http向需要https的网址发出请求时遇到此错误。我猜ajax调用不处理重定向。即使将crossDomain ajax选项设置为true(在JQuery 1.5.2上)也是如此。

答案 9 :(得分:0)

我有同样的问题,但在我的情况下,它原来是一个cookie问题。在后端工作的人改变了我们登录到我们的应用程序时设置的JSESSIONID cookie的路径,并且我的计算机上有一个旧名称,但是使用旧路径。因此,当我尝试登录浏览器(Chrome)时,向服务器发送了两个名为JSESSIONID且具有不同值的cookie,这可以理解地混淆了它,因此它取消了请求。从我的计算机中删除cookie修复了它。

答案 10 :(得分:0)

我以一种更加怪异的方式出现了这个错误:网络选项卡和chrome:// net-internals /#events在js完成后没有显示请求。暂停错误调用中的js时,网络选项卡确实将请求显示为(已取消)。在网页中一直要求几个类似请求中的一个(总是相同的)。重新启动Chrome后,错误没有再次出现!

答案 11 :(得分:0)

在我的情况下,我的Apache的mod-rewrite匹配url并将请求重定向到https。

查看chrome:// net-internals /#events中的请求。

它将显示请求的内部日志。检查重定向。

答案 12 :(得分:0)

我在Firefox中取消了 。有些ajax调用对我来说非常好,但实际上不得不使用它的同事失败了。

当我通过上面提到的Chrome技巧检查出来时,我发现没有任何可疑之处。在firebug中检查时,它显示两次恶意调用后的“加载”动画,没有结果选项卡。

解决方案非常简单:转到历史记录,找到网站,右键单击 - &gt;忘了网站。
忘了,不要删除。

之后,再也没有问题了。我的猜测是它与.htaccess有关。

答案 13 :(得分:0)

就我而言,它是url中缺少的尾部斜杠。 添加尾部斜杠解决了我的问题。

答案 14 :(得分:0)

对于Dropzone.js案例。 在我的情况下,它是由于timeout option默认值太低而导致的。所以根据你的需要增加它。

{
// other dropzone options
timeout: 60000 * 10, // 10 minutes
...
}

答案 15 :(得分:0)

丢弃AJAX请求(如果不是跨域请求)有两种可能性:

  1. 您不会阻止该事件的元素默认行为。
  2. 您将AJAX的超时时间设置得太低,或者网络/应用程序后端服务器运行缓慢。

1)的解决方案: 在事件处理程序中添加return false;e.preventDefault();

解决方案2): 在形成AJAX请求时添加超时选项。下面的示例。

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

对于跨域请求,请检查跨域资源共享(CORS)HTTP标头。

答案 16 :(得分:-1)

我遇到了特定3G网络的这个问题 在chrome:// net-internals /#events中使用net_error = -101的DELETE请求始终会失败。

其他网络工作正常,所以我假设有一个有问题的代理服务器或其他东西。

相关问题