jQuery Ajax请求被取消而未发送


87

我正在尝试将脚本连接到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对象上的error属性仅为“错误”,状态为0。 。

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

当然,这里的区别在于这是GET而不是POST,但是我已经在脚本中尝试过了,这没有什么区别。

我对此感到非常困惑,不胜感激。


您是否尝试过处理error回调以查看是否返回错误?
StriplingWarrior

1
“我正在发送带有原始html文件的“ Access-Control-Allow-Origin:*”标头,以尝试消除XSS限制,这是我的问题。” 您是说服务器正在发回Access-Control-Origin标头吗?还是您将其与Ajax请求一起发送?
杰森·迪恩

尝试直接通过url访问该页面,看看是否有任何问题
zod 2011年

1
是的,我收到状态文本为“”且代码为0的错误回调。这不是jQuery问题;它不是jQuery问题。我使用直接的XHR重新编写了代码,并且得到了相同的结果-即readyState为4,request.status为零,request.responseText为空。服务器正在发送Access-Control-Allow-Origin标头。直接通过URL访问页面将返回预期的XML响应。
格雷厄姆·惠勒

Answers:


134

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


这也对我有用。谢谢。我忘了为什么我在onClick处理程序中返回false,然后将其更改为true,而在阅读您的帖子后,它突然突然出现在我身上。
Shiprack

4
此外,如果您使用的是表单,则需要return falseonsubmit属性末尾添加。
杰森·阿克森

8
@VincentClyde"return false;"告诉表单和链接中止操作。这最初用于javascript表单验证,其中,如果表单无效,validate函数将返回false,从而阻止提交表单。
Tyzoid

13
你也可以使用e.preventDefault();,在这里eonclick事件参数。
Hannele 2014年

1
@Hannele非常感谢您分享event.preventDefault。我非常需要它。我没有看到其他答案暗示这一点。您应该将此作为单独的答案发布。
Mohit

112

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

您需要使用 chrome://net-internals/#events它来向您显示发送请求的详细信息-包括有关发送的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)

我也有一个(已取消)问题。@Ben,很高兴了解此跟踪,很遗憾,它没有提供任何信息。在我的情况下,服务器是S3,并且在我的存储桶中配置了cors。我正在做的只是获取图像的简单GET。我在网络面板中看到带有Origin标头的请求,但没有响应。显然,Chrome会先取消请求,然后再将其发送到服务器。没有重定向,没有https,没有content-lenght0。整天敲打我的头,仍然是个谜。
Gene Vayngrib

@GeneVayngrib尝试使用Firefox-网络调试器将直接显示更多信息-您可以在那里解决问题,然后在Chrome中运行。
Ben Walding 2013年

@BenW谢谢您,但是Firefox对于从Amazon S3提供的该图像没有问题。
Gene Vayngrib

YUPP。那很有帮助!
rubmz

21

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

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

要么

没有类型=> type='button'


3
死灵张贴在这里,起诉我stackoverflow。我整天都在搜寻高低,以查找为什么我的请求可以从控制台而不是脚本运行的原因,这就是答案..谢谢!!!
pcort

1
我登录并再次发现该主题以支持这个答案!!,这很有帮助。让我头好几个小时
dev

Jai shree krishna,希望它能帮助许多人。他们更早就知道了。
黑曼巴舞

6

我有一个类似的问题。就我而言,我试图在apache服务器+ django上使用Web服务(该服务由我自己编写)。我的输出与您相同:Chrome表示已取消,而FF没问题。如果我尝试直接在浏览器而不是ajax上访问该服务,那么它也将正常工作。在Google上四处搜寻,我发现某些较新版本的apache并未在响应标头中正确设置响应的长度,因此我手动进行了此操作。使用django,我要做的就是:

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

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


我尝试设置content-length标头,但仍然遇到与原始问题中所述相同的问题。我正在使用PHP 5.3.8和Apache 2.2.21(在Windows 7中使用WAMP)
rodrigo-silveira 2012年

4

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


3

(使用Web窗体ASP.NET)

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


非常感谢你。
Farheen Nilofer

3

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


您如何解决此问题?我的网站正在嵌入不受我控制的iFrame中。我希望完成某些背景数据设置的呼叫
Rips

@Rips这是4年前,无论如何,我认为我通过使用Promises
Reza

3

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

如果您这样设置链接:

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

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

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

为了防止您的浏览器跟踪链接并取消正在进行的任何请求,应添加return falsee.preventDefault()阻止click事件的传播:

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

要么:

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

2

丢弃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标头。


1

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


0

就我而言,我的Apache mod-rewrite匹配url并将请求重定向到https。

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

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


0

我遇到了同样的问题,但就我而言,这是一个cookie问题。在后端工作的家伙已经更改了JSESSIONID cookie的路径,该路径是在我们登录到应用程序时设置的,并且我的计算机上具有该名称的旧cookie,但路径却旧。因此,当我尝试登录浏览器(Chrome)时,将两个具有不同值的名为JSESSIONID的cookie发送到了服务器-这很容易引起混淆-因此,它取消了请求。从我的计算机上删除Cookie会修复它。


0

我以更怪异的方式遇到了此错误:js完成后,“网络”标签和chrome:// net-internals /#events没有显示请求。当在错误callcack中暂停js时,网络标签确实将请求显示为(已取消)。始终在网页中始终要求几个相似请求中的一个(总是相同)。重新启动Chrome后,错误不再出现!


0

在Firefox中取消了。一些ajax调用对我来说工作得很好,但是对于实际上不得不使用它的同事却失败了。

当我通过上述Chrome技巧进行检查时,没有发现任何可疑之处。在萤火虫中检查它时,它在两次恶意呼叫后显示“正在加载”动画,并且没有“结果”选项卡。

解决方案非常简单:进入历史记录,找到网站,右键单击->忘记网站。
忘记,不删除。

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


0

就我而言,这是网址中缺少的结尾斜杠。添加斜杠解决了我的问题。


0

对于Dropzone.js情况。在我的情况下,这是由于默认情况下timeout选项值太低所致。因此,根据您的需要增加它。

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

-1

我在特定的3G网络上遇到了这个问题。对于chrome:// net-internals /#events中的
DELETE请求,它总是会失败net_error = -101

其他网络工作正常,因此我认为代理服务器出现故障。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.