Kesalahan 'Tidak Ada Transportasi' dengan panggilan ajax jQuery di IE


110

Saya perlu menggunakan API foursquare untuk mencari tempat. Tentu saja ini lintas domain.

Tidak ada masalah di Firefox tetapi di Internet Explorer (7, 8, 9 saya sudah menguji).

Kode javascript saya terlihat seperti:

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);
       }
    });
}

Di Firefox, ini dengan sempurna menampilkan data yang diterima. Di Internet Explorer, itu log di konsol:

No Transport
Error
Error

Apa yang harus saya lakukan?


6
Lihat jawaban untuk posting SO ini
mkozicki

Jawaban:


265

Saya menguji ini di Windows Mobile 7.

Setelah BANYAK waktu yang dihabiskan untuk memahami, akhirnya saya menemukan ini:

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

Solusinya sederhana, cukup atur ini:

$.support.cors = true;

dan permintaan lintas domain Ajax akan berfungsi!


47
Saya mendapatkan 'Kesalahan: Akses ditolak' juga di IE8 dan IE9
Darren Cooney

1
Agak mengecilkan hati karena jawaban yang diterima tidak benar-benar menyelesaikan masalah di IE8 atau IE9.
Warren Rumak

2
Saya memiliki masalah serupa. Bekerja di IE10 tetapi tidak di IE8 atau IE9
mishka

7
Saya juga mendapat "Kesalahan: Akses ditolak", kesalahan saya adalah saya menarik konten HTTPS dari domain HTTP. Pastikan situs web Anda dan target ajax Anda menggunakan protokol yang sama (baik HTTP ATAU HTTPS)
Torben

2
Saya yakin ini disetel secara default sekarang. Bagi saya solusinya adalah transportasi permintaan XDR - lihat jawaban populer ini: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

Anda perlu membuat nilai lintas domain menjadi benar


8
Apa perbedaan antara jawaban Anda dan jawaban yang diterima, yang telah diposting beberapa waktu sebelum Anda?
javanna

2
@javanna Penambahan crossDomain: trueargumen opsi.
Chris Marasti-Georg

8
Apa itu lintas domain dan mengapa itu harus benar?
Aziz Saleh

Anda tidak perlu crossDomain: trueitu yang $.support.corsdilakukan secara default jika saya tidak salah
Mark Pieszak - Trilon.io

7

Masalah ini telah mengganggu saya selama beberapa waktu. Sebagai solusi, saya menggunakan skrip proxy yang terletak di situs yang sama. Skrip semacam itu cukup mengeksekusi permintaan HTTP non-ajax server-ke-server (pikirkan curl dan WinHttp.WinHttpRequest) dan meneruskan status dan data kembali ke pemanggil. Ini berfungsi, tetapi jelas tidak terlalu efisien karena harus melakukan dua permintaan HTTP.

Dalam kasus saya, solusinya adalah kombinasi dari semua hal yang dijelaskan di atas ditambah header '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': '*'
  },
  ...
});

Layanan web yang menjawab panggilan ini juga merespons dengan header 'Access-Control-Allow-Origin: *'.


4
... namun ini adalah jawaban pertama untuk menyebutkan header CORS. Solusi yang diterima tidak berhasil untuk saya.
seanhodges

2
Saya kira ini lebih baik berada di web.config dari layanan.
Fjodr

6

Coba solusi ini:

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

Atau, cukup letakkan kode ini di HTML Anda tepat setelah memasukkan jquery.

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

Saya menemukan masalah yang sama terjadi di Chrome (dan mungkin Browser Android) di Android, jadi mungkin tinggalkan komentar bersyarat untuk mengizinkan semua browser menggunakan skrip ini. (Halaman beranda proyek ada di sini: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
Ini berhasil untuk saya. Selain memastikan bahwa Jenis Konten Respons adalah 'teks / biasa'
Nikolay Melnikov

Saya menambahkannya di Grunt setelah jquery dan sekarang berfungsi ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

Saya baru saja mengubah versi jquery dan mengganti tautan CDN dan berhasil! Lakukan saja jika crossDomain:truedan $.support.cors= true tidak berfungsi.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.