IE'de jQuery ajax çağrısıyla 'Aktarım Yok' Hatası


110

Mekan aramak için foursquare API kullanmam gerekiyor. Elbette alanlar arasıdır.

Firefox'ta sorun yok ama Internet Explorer'da (7, 8, 9 test ettim).

JavaScript kodum şöyle görünüyor:

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'ta alınan verileri mükemmel bir şekilde görüntüler. Internet Explorer'da konsolda oturum açar:

No Transport
Error
Error

Ne yapmalıyım?


Yanıtlar:


265

Bunu Windows Mobile 7'de test ettim.

Anlamak için çok zaman harcadıktan sonra, sonunda şunu buldum:

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

Çözüm basit, sadece şunu ayarlayın:

$.support.cors = true;

ve Ajax etki alanları arası istekleri çalışacaktır!


47
IE8 ve IE9'da da 'Hata: Erişim reddedildi' mesajı alıyorum
Darren Cooney

1
Kabul edilen cevabın aslında IE8 veya IE9'daki sorunu çözmemesi biraz cesaret kırıcı.
Warren Rumak

2
Benzer bir sorunum var. IE10'da çalışıyor ancak IE8 veya IE9'da çalışmıyor
mishka

7
Ayrıca "Hata: Erişim reddedildi" mesajı aldım, hatam HTTPS içeriğini bir HTTP etki alanından çekmiş olmamdı. Web sitenizin ve ajax hedefinizin aynı protokolleri (HTTP VEYA HTTPS) kullandığından emin olun
Torben

2
Bunun varsayılan olarak ayarlandığına inanıyorum. Benim için çözüm bir XDR istek aktarımıydı - şu popüler yanıta bakın: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

etki alanları arası değeri doğru yapmanız gerekir


8
Cevabınız ile sizinkinden epey bir süre önce yayınlanan kabul edilen cevap arasındaki fark nedir?
javanna

2
@javanna crossDomain: trueSeçenekler bağımsız değişkeninin eklenmesi .
Chris Marasti-Georg

8
Çapraz etki alanı nedir ve neden doğru olması gerekir?
Aziz Saleh

Buna gerek yok crossDomain: truebu ne en $.support.corsyanılmıyorsam eğer varsayılan olarak yapar
Mark Pieszak - Trilon.io

7

Bu sorun beni bir süredir rahatsız ediyor. Çözüm olarak, aynı sitede bulunan proxy komut dosyalarını kullanıyorum. Bu tür komut dosyaları, basitçe sunucudan sunucuya ajax dışı HTTP isteğini yürütür (curl ve WinHttp.WinHttpRequest'i düşünün) ve durumu ve verileri arayana geri iletir. Çalışır, ancak iki HTTP isteği gerçekleştirmesi gerektiğinden açıkça çok verimli değildir.

Benim durumumda, çözüm, yukarıda açıklanan tüm şeylerin yanı sıra 'Access-Control-Allow-Origin' başlığının bir kombinasyonudur.

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

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

Bu çağrıları yanıtlayan web hizmeti de 'Access-Control-Allow-Origin: *' başlığıyla yanıt verir.


4
... ve yine de bu, CORS başlığından bahseden ilk cevaptır. Kabul edilen çözüm benim için işe yaramadı.
seanhodges

2
Sanırım bu servisin web.config dosyasında olmalı.
Fjodr

6

Bu çözümü deneyin:

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

Veya jquery'yi ekledikten hemen sonra bu kodu HTML'nize yerleştirin.

<!--[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]-->

Aynı sorunu Android'de Chrome'da (ve muhtemelen Android Tarayıcısında) da buldum, bu nedenle tüm tarayıcıların bu komut dosyasını kullanmasına izin vermek için koşullu yorumu devre dışı bırakın. (Proje ana sayfası burada: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
Bu benim için çalıştı. Yanıt İçeriği türünün "metin / düz" olduğundan emin olmanın yanı sıra
Nikolay Melnikov


0

Jquery sürümünü değiştirdim ve CDN bağlantısını değiştirdim ve işe yaradı! Sadece crossDomain:trueve $.support.cors= true çalışmıyorsa yapın.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.