IE中出现jQuery ajax调用时出现“无传输”错误


110

我需要使用foursquare API搜索场所。当然,它是跨域的。

它在Firefox中没有任何问题,但是在Internet Explorer中(我已经测试过7、8、9)。

我的JavaScript代码如下所示:

searchVenues: function(searchQuery) {
    $.ajax({
       url: 'https://api.foursquare.com/v2/venues/search',
       data: {
            sw: bound_south_west,
            ne: bound_north_east,
            query: searchQuery.query,
            oauth_token: FSQ_OAUTH_TOKEN,
            limit: 25,
            intent: 'browse',
            v: 20120206
       },
       cache: false,
       dataType: 'json',
       success: function(data) {
           displayResults(data, searchQuery.query);
       },
       error: function(xhr, status, errorThrown) {
           console.log(errorThrown+'\n'+status+'\n'+xhr.statusText);
       }
    });
}

在Firefox中,它可以完美显示接收到的数据。在Internet Explorer中,它登录控制台:

No Transport
Error
Error

我该怎么办?


Answers:


265

我在Windows Mobile 7上对此进行了测试。

经过大量的时间来理解后,我终于找到了:

http://bugs.jquery.com/ticket/10660

解决方案很简单,只需设置以下内容:

$.support.cors = true;

和Ajax跨域请求将起作用!


47
我在IE8和IE9上也收到“错误:访问被拒绝”的通知
-Darren Cooney,

1
令人沮丧的是,已接受的答案实际上无法解决IE8或IE9上的问题。
沃伦·鲁马克

2
我有一个类似的问题。在IE10中工作,但在IE8或IE9中不工作
mishka 2014年

7
我还收到“错误:访问被拒绝”,我的错误是我从HTTP域中提取了HTTPS内容。确保您的网站和ajax目标使用相同的协议(HTTP或HTTPS)
Torben 2014年

2
我相信这是默认设置。对我来说,解决方案是XDR请求传输-请参见以下流行解答:stackoverflow.com/a/10232313/217866
jackocnr 2014年

13
jQuery.support.cors = true;

$.ajax({
  crossDomain: true,
  url: "",
  type: "POST",
  dataType: "xml",
  data: soapMessage,
});

您需要将跨域值设为true


8
您的答案和您的答案早于您的答案发布了一段时间之间有什么区别?
javanna

2
@javanna crossDomain: true在options参数中的添加。
克里斯·马拉斯蒂·乔治

8
什么是跨域,为什么它必须为真?
Aziz Saleh 2014年

如果我没有记错的话crossDomain: true,您不需要$.support.cors默认情况下的操作
Mark Pieszak-Trilon.io 2016年

7

这个问题困扰了我一段时间。解决方法是,使用位于同一站点上的代理脚本。这样的脚本仅执行服务器到服务器的非ajax HTTP请求(考虑一下curl和WinHttp.WinHttpRequest),然后将状态和数据传递回调用方。它可以工作,但显然效率不高,因为它必须执行两个HTTP请求。

就我而言,解决方案是上述所有内容加上“ Access-Control-Allow-Origin”标头的组合。

$.support.cors = true; // this must precede $.ajax({}) configuration

$.ajax({
  crossDomain: true, // added in jQuery 1.5
  headers: {
    'Access-Control-Allow-Origin': '*'
  },
  ...
});

应答这些呼叫的Web服务还以“ Access-Control-Allow-Origin:*”头作为响应。


4
...但是,这是提到CORS标头的第一个答案。接受的解决方案对我不起作用。
seanhodges

2
我想这应该在服务的web.config中。
Fjodr 2015年

6

试试这个解决方案:

https://stackoverflow.com/a/14463975/237091

或者,只需在包含jquery之后立即将此代码放入HTML中即可。

<!--[if lte IE 9]>
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js'></script>
<![endif]-->

我发现在Android上的Chrome(甚至可能是Android浏览器)中也发生了同样的问题,所以也许不要添加条件注释,以允许所有浏览器使用此脚本。(项目主页在这里:github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
Dave Burt

1
这对我有用。除了确保Response Content-type为'text / plain'
Nikolay Melnikov

我在jquery之后在Grunt中添加了它,现在它可以工作了(npmjs.com/package/jquery-ajax-transport-xdomainrequest)。
tobias47n9e '16

0

我只是更改了jQuery版本并替换了CDN链接,所以它起作用了!如果crossDomain:trueand $.support.cors= true不起作用,请执行此操作。

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
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.