Lỗi 'No Transport' với lệnh gọi ajax jQuery trong IE


110

Tôi cần sử dụng API foursquare để tìm kiếm địa điểm. Tất nhiên đó là miền chéo.

Nó không có bất kỳ sự cố nào trong Firefox nhưng trong Internet Explorer (tôi đã thử nghiệm 7, 8, 9).

Mã javascript của tôi trông giống như:

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

Trong Firefox, nó hiển thị dữ liệu đã nhận một cách hoàn hảo. Trong Internet Explorer, nó đăng nhập trên bảng điều khiển:

No Transport
Error
Error

Tôi nên làm gì?


6
Kiểm tra các câu trả lời cho bài SO này
mkozicki

Câu trả lời:


265

Tôi đã thử nghiệm điều này trên Windows Mobile 7.

Sau rất nhiều thời gian để hiểu, cuối cùng tôi đã tìm thấy điều này:

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

Giải pháp rất đơn giản, chỉ cần thiết lập điều này:

$.support.cors = true;

và các yêu cầu tên miền chéo Ajax sẽ hoạt động!


47
Tôi cũng nhận được 'Lỗi: Quyền truy cập bị từ chối' trên IE8 và IE9
Darren Cooney

1
Hơi nản khi câu trả lời được chấp nhận không thực sự giải quyết được vấn đề trên IE8 hoặc IE9.
Warren Rumak

2
Tôi có một vấn đề tương tự. Hoạt động trong IE10 nhưng không phải trong IE8 hoặc IE9
mishka

7
Tôi cũng gặp phải "Lỗi: Quyền truy cập bị từ chối", lỗi của tôi là tôi đã lấy nội dung HTTPS từ miền HTTP. Đảm bảo rằng trang web của bạn và mục tiêu ajax của bạn sử dụng cùng một giao thức (HTTP HOẶC HTTPS)
Torben

2
Tôi tin rằng điều này được đặt theo mặc định ngay bây giờ. Đối với tôi, giải pháp là một phương tiện giao thông yêu cầu XDR - xem câu trả lời này phổ biến: stackoverflow.com/a/10232313/217866
jackocnr

13
jQuery.support.cors = true;

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

bạn cần biến giá trị miền chéo thành true


8
Sự khác biệt giữa câu trả lời của bạn và câu được chấp nhận, câu trả lời đã được đăng trước bạn một thời gian là gì?
javanna

2
@javanna Việc bổ sung crossDomain: trueđối số tùy chọn.
Chris Marasti-Georg

8
Miền chéo là gì và tại sao nó cần phải đúng?
Aziz Saleh

Bạn không cần phải crossDomain: truecó của những gì $.support.corskhông theo mặc định nếu tôi không nhầm
Đánh dấu Pieszak - Trilon.io

7

Vấn đề này đã làm phiền tôi một thời gian. Để giải quyết vấn đề, tôi sử dụng các tập lệnh proxy nằm trên cùng một trang web. Các tập lệnh như vậy chỉ đơn giản thực hiện yêu cầu HTTP không phải ajax từ máy chủ đến máy chủ (hãy nghĩ đến curl và WinHttp.WinHttpRequest) và chuyển trạng thái và dữ liệu trở lại trình gọi. Nó hoạt động, nhưng rõ ràng là không hiệu quả lắm vì nó phải thực hiện hai yêu cầu HTTP.

Trong trường hợp của tôi, giải pháp là sự kết hợp của tất cả những điều được mô tả ở trên cộng với tiêu đề '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': '*'
  },
  ...
});

Dịch vụ web trả lời các cuộc gọi này cũng phản hồi với tiêu đề 'Access-Control-Allow-Origin: *'.


4
... và đây là câu trả lời đầu tiên đề cập đến tiêu đề CORS. Giải pháp được chấp nhận không hoạt động đối với tôi.
seanhodges

2
Tôi đoán điều này nên có trong web.config của dịch vụ.
Fjodr

6

Hãy thử giải pháp này:

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

Hoặc, chỉ cần đặt mã này vào HTML của bạn ngay sau khi bao gồm 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]-->

Tôi nhận thấy sự cố tương tự xảy ra trong Chrome (và có thể cả Trình duyệt Android) trên Android, vì vậy có lẽ nên bỏ nhận xét có điều kiện để cho phép tất cả các trình duyệt sử dụng tập lệnh này. (Trang chủ của dự án ở đây: github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest )
Dave Burt

1
Điều này đã làm việc cho tôi. Ngoài ra để đảm bảo rằng các ứng Content-type là 'text / plain'
Nikolay Melnikov

Tôi đã thêm nó vào Grunt sau khi jquery và bây giờ nó hoạt động ( npmjs.com/package/jquery-ajax-transport-xdomainrequest ).
tobias47n9e

0

Tôi vừa thay đổi phiên bản jquery và thay thế liên kết CDN và nó hoạt động! Chỉ làm điều đó nếu crossDomain:true$.support.cors= true không hoạt động.

<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.