다음은 IE를 제외한 모든 브라우저에서 작동합니다 (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'
}
);
을 사용하는 다른 함수가 dataType: 'jsonp'
있지만이 AJAX 호출에서 반환 된 데이터가 필요하지 않습니다. 내 마지막 수단은 JSONP로 래핑 된 약간의 엉터리를 반환하는 것입니다.
IE가 데이터를 반환하지 않는 CORS 요청으로 망쳐 놓은 이유는 무엇입니까?
답변
이것은 jQuery 의 알려진 버그 입니다. jQuery 팀은 “이를 핵심으로 지원할 계획이 없으며 플러그인으로 더 적합합니다.” ( 이 주석 참조 ). IE는 XMLHttpRequest를 사용 하지 않고 XDomainRequest 라는 대체 개체를 사용합니다 .
가 있다 jQuery를에이 기능을 지원하는 데 사용할 플러그인, 여기에서 찾을 수 있습니다이 :
https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDIT
이 기능 $.ajaxTransport
은 운송업자 공장을 등록합니다. 전송자는 요청을 수행하기 위해 내부적 으로 사용됩니다 $.ajax
. 따라서 평소처럼 전화 할 수 있어야 한다고 생각 합니다 $.ajax
. 운송 업체 및 확장에 대한 정보는 여기$.ajax
에서 찾을 수 있습니다 .
또한이 플러그인의 더 나은 버전은 여기 에서 찾을 수 있습니다 .
다른 두 가지 참고 사항 :
- 개체 XDomainRequest는 IE8 에서 도입되었으며 아래 버전에서는 작동하지 않습니다.
- IE10에서 CORS는 일반 XMLHttpRequest를 사용하여 지원됩니다 .
편집 2 : http to https 문제
요청은 호스팅 페이지와 동일한 체계를 대상으로해야합니다.
이 제한은 AJAX 페이지가
http://example.com 에있는 경우 대상 URL도 HTTP로 시작해야 함을 의미합니다. 마찬가지로 AJAX 페이지가 https://example.com 에있는 경우 대상 URL도 HTTPS로 시작해야합니다.
답변
@dennisg가 받아 들인 대답을 바탕으로 MoonScript의 jQuery.XDomainRequest.js 를 사용하여 성공적으로 수행했습니다 .
다음 코드는 Chrome, Firefox 및 IE10에서 올바르게 작동했지만 IE9에서는 실패했습니다. 스크립트를 포함하기 만하면 이제 IE9에서 자동으로 작동합니다. (아마 8 명이지만 테스트하지는 않았습니다.)
var displayTweets = function () {
$.ajax({
cache: false,
type: 'GET',
crossDomain: true,
url: Site.config().apiRoot + '/Api/GetTwitterFeed',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (data) {
for (var tweet in data) {
displayTweet(data[tweet]);
}
}
});
};
답변
“jQuery-ajaxTransport-XDomainRequest”플러그인을 사용하여이 작업을 수행하는 방법에 대한 전체 지침은 여기에서 찾을 수 있습니다.
https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
이 플러그인은 적극적으로 지원되며 HTML, JSON 및 XML을 처리합니다. 이 파일은 CDNJS에서도 호스팅되므로 추가 설정없이 스크립트를 페이지에 직접 드롭 할 수 있습니다.
http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest .min.js
답변
문제는 IE9 이하가 CORS를 지원하지 않는다는 것입니다. XDomainRequest는 GET / POST 및text/plain
http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx에 설명 된대로 conten-type 합니다.
따라서 모든 HTTP 동사 및 / 또는 json 등을 사용하려면 다른 솔루션을 사용해야합니다. IE9 이하가 사용되는 경우 프록시로 정상적으로 다운 그레이드되는 프록시를 작성했습니다. ASP.NET을 사용하는 경우 코드를 전혀 변경할 필요가 없습니다.
해결책은 두 부분으로 나뉩니다. 첫 번째는 jQuery ajax 처리에 연결되는 jquery 스크립트입니다. crossDomain 요청이 이루어지고 브라우저가 IE 인 경우 자동으로 웹 서버를 호출합니다.
$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
if (!window.CorsProxyUrl) {
window.CorsProxyUrl = '/corsproxy/';
}
// only proxy those requests
// that are marked as crossDomain requests.
if (!options.crossDomain) {
return;
}
if (getIeVersion() && getIeVersion() < 10) {
var url = options.url;
options.beforeSend = function (request) {
request.setRequestHeader("X-CorsProxy-Url", url);
};
options.url = window.CorsProxyUrl;
options.crossDomain = false;
}
});
웹 서버에서 요청을 수신하고 X-CorsProxy-Url http 헤더에서 값을 가져와 HTTP 요청을 수행하고 마지막으로 결과를 반환해야합니다.
내 블로그 게시물 : http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
답변
지원되는 모든 브라우저 (IE7 + 및 일반)에 대한 유일한 솔루션이기 때문에 모든 요청을 JSONP로 작성 했습니다. 귀하의 답변은 기술적으로 IE9에서 작동하므로 올바른 답변을 얻을 수 있습니다.
답변
MoonScript의 솔루션을 기반으로하는 대신 다음을 시도해 볼 수 있습니다.
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
이점은 낮은 수준의 솔루션이기 때문에 jQuery뿐만 아니라 다른 프레임 워크와 함께 IE 8/9에서 CORS (가능한 범위까지)를 활성화 할 수 있다는 것입니다. AngularJS, jQuery 1.x 및 2.x와 함께 사용하는 데 성공했습니다.
답변
Internet Explorer 8 및 최신 버전에서 jQuery를 사용하여 교차 도메인 JSON 가져 오기
매우 유용한 링크 :
X 도메인 요청에서 json을 반환하는 문제를 해결할 수 있습니다.
이것이 누군가에게 도움이되기를 바랍니다.