Poniższe działa we wszystkich przeglądarkach oprócz IE (testuję w IE 9).
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert('marked as read');
},
error: function(a,b,c) {
alert('failed');
},
type: 'post'
}
);
Mam inną funkcję, która używa dataType: 'jsonp'
, ale nie potrzebuję żadnych danych zwracanych w tym wywołaniu AJAX. Moją ostatnią deską ratunku będzie zwrócenie jakiegoś jibberisha zapakowanego w JSONP, aby to zadziałało.
Jakieś pomysły, dlaczego IE spieprzyło żądanie CORS, które nie zwraca żadnych danych?
jquery
internet-explorer-9
cross-domain
jsonp
cors
Garrett
źródło
źródło
Odpowiedzi:
To znany błąd dotyczący jQuery. Zespół jQuery „nie planuje obsługi tego w rdzeniu i lepiej nadaje się jako wtyczka”. (Zobacz ten komentarz ). IE nie używa XMLHttpRequest , ale alternatywny obiekt o nazwie XDomainRequest .
Dostępna jest wtyczka do obsługi tego w jQuery, którą można znaleźć tutaj : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDYCJA Funkcja
$.ajaxTransport
rejestruje fabrykę transportera. Transporter jest używany wewnętrznie przez firmę$.ajax
do wykonywania zleceń. Dlatego zakładam, że powinieneś móc zadzwonić$.ajax
jak zwykle. Informacje o transporterach i przedłużeniach$.ajax
można znaleźć tutaj .Również prawdopodobnie lepszą wersję tej wtyczki można znaleźć tutaj .
Dwie inne uwagi:
Edycja 2: problem z http do https
Źródło: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx
źródło
http
nahttps
), domen (google.com
nabing.com
), subdomen (mail.google.com
namaps.google.com
) lub protokołów (google.com:80
- domyślny port nagoogle.com:8080
) spowoduje wysłanie żądania „międzydomenowego”. Zasadniczo wszystko przed pierwszą/
w adresie URL musi być identyczne.Opierając się na zaakceptowanej odpowiedzi @dennisg, udało mi się to pomyślnie osiągnąć przy użyciu jQuery.XDomainRequest.js autorstwa MoonScript.
Poniższy kod działał poprawnie w Chrome, Firefox i IE10, ale nie działał w IE9. Po prostu dołączyłem skrypt i teraz automagicznie działa w IE9. (I prawdopodobnie 8, ale nie testowałem tego.)
źródło
Pełne instrukcje, jak to zrobić za pomocą wtyczki „jQuery-ajaxTransport-XDomainRequest”, można znaleźć tutaj: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
Ta wtyczka jest aktywnie obsługiwana i obsługuje HTML, JSON i XML. Plik jest również hostowany na CDNJS, więc możesz bezpośrednio upuścić skrypt na swoją stronę bez dodatkowej konfiguracji: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js
źródło
Problem polega na tym, że IE9 i starsze nie obsługują CORS. XDomainRequest obsługuje tylko GET / POST i
text/plain
typ zawartości, jak opisano tutaj: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspxWięc jeśli chcesz używać wszystkich czasowników HTTP i / lub json itp., Musisz użyć innego rozwiązania. Napisałem proxy, które z wdziękiem przejdzie na serwer proxy, jeśli używany jest IE9 lub mniej. Nie musisz w ogóle zmieniać kodu, jeśli używasz ASP.NET.
Rozwiązanie jest w dwóch częściach. Pierwszym jest skrypt jquery, który podpina się do przetwarzania jQuery ajax. Automatycznie wywoła serwer sieciowy, jeśli zostanie wysłane żądanie crossDomain, a przeglądarka to IE:
Na swoim serwerze WWW musisz odebrać żądanie, pobrać wartość z nagłówka X-CorsProxy-Url http, wykonać żądanie HTTP i na koniec zwrócić wynik.
Mój post na blogu: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
źródło
Właśnie wykonałem wszystkie żądania JSONP, ponieważ było to jedyne rozwiązanie dla wszystkich naszych obsługiwanych przeglądarek (IE7 + i zwykłych). Pamiętaj, że twoja odpowiedź technicznie działa dla IE9, więc masz poprawną odpowiedź.
źródło
Opierając się na rozwiązaniu MoonScript, możesz spróbować tego:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
Zaletą jest to, że ponieważ jest to rozwiązanie niższego poziomu, umożliwi CORS (w miarę możliwości) w IE 8/9 z innymi frameworkami, nie tylko z jQuery. Odniosłem sukces, używając go z AngularJS, a także z jQuery 1.x i 2.x.
źródło
Pobieranie międzydomenowego formatu JSON za pomocą jQuery w programie Internet Explorer 8 i nowszych wersjach
Bardzo przydatny link:
http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/
Może pomóc w problemach ze zwracaniem pliku json z żądania domeny X.
Mam nadzieję, że to komuś pomoże.
źródło
Aby rozwiązać ten problem, sprawdź również, czy masz dołączony plik .js do pliku Ajax o nazwie: Otrzymałem błąd odmowy dostępu podczas dołączania shadowbox.js w moim pliku ajax.php
źródło
Testowałem usługę internetową CORS na moim komputerze deweloperskim i otrzymywałem komunikat o błędzie „Odmowa dostępu” tylko w przeglądarce IE. Firefox i Chrome działały dobrze. Okazuje się, że było to spowodowane moim użyciem localhost w wywołaniu Ajax! Więc adres URL mojej przeglądarki wyglądał następująco:
http: //my_computer.my_domain.local/CORS_Service/test.html
a moje wywołanie Ajax w pliku test.html wyglądało tak:
Wszystko działało, gdy zmieniłem wywołanie Ajax tak, aby używał adresu IP mojego komputera zamiast lokalnego hosta.
Zakładka „Sieć” w oknie narzędzi deweloperskich IE pokazuje również żądanie CORS Preflight OPTIONS, po którym następuje XMLHttpRequest GET, co jest dokładnie tym, czego się spodziewałem.
źródło
Aktualizacja z początku 2015 r. XDomain to powszechnie używana biblioteka obsługująca CORS w IE9 z ograniczonym dodatkowym kodowaniem.
https://github.com/jpillora/xdomain
źródło
Spróbuj użyć wtyczki jquery-transport-xdr jQuery do żądań CORS w IE8 / 9.
źródło
Uwaga - uwaga
nie używaj „ http://www.domain.xxx ”, „ http: // localhost / ” lub „IP >> 127.0.0.1” jako adresu URL w ajax. używaj tylko ścieżki (katalogu) i nazwy strony bez adresu.
stan fałszywy:
stan rzeczywisty:
źródło