복붙노트

[JQUERY] 크로스 도메인 호출에 IE에서 실패 아약스 JQuery와 $

JQUERY

크로스 도메인 호출에 IE에서 실패 아약스 JQuery와 $

해결법


  1. 1.IE의 문제는 보안 영역 크로스 도메인 요청을 허용하도록 정의하지에 의존하고 있는지 확인할 수 있을까요? 에 대한 설명이 마이크로 소프트 페이지를 참조하십시오.

    IE의 문제는 보안 영역 크로스 도메인 요청을 허용하도록 정의하지에 의존하고 있는지 확인할 수 있을까요? 에 대한 설명이 마이크로 소프트 페이지를 참조하십시오.

    OTOH,이 페이지는 IE7과 eariler 할 수없는 도메인 간 호출하지만, IE8은, XMLHttpRequest를, 하나 개 JQuery와 용도가 아닌 다른 객체를 사용 할 수 있음을 언급하고있다. XDomainRequest 작동하는지 당신은 확인 수 있을까요?

    EDIT (2013년 8월 22일)

    여기 웨이 백 머신에서 가져온 그 정보의 일부를 쓰고 있어요, 그래서 두 번째 링크는, 죽은 :


  2. 2.IE8 및 IE9 위해 당신은 XDomainRequest (XDR)를 사용합니다. 당신은 아래에 보면 당신은 $ 아약스와 유사한 형식의 일종이다 확인할 수 있습니다. 지금까지 내 연구가 저를 가지고 같이 내가 IE6 및 7에서이 도메인 간 작업을 얻을 수 없다 (아직 이것에 대한 주위에 일자리를 찾고). XDR 먼저 IE8 (그것은 또한 IE9에서의)에서 나왔다. 그러니까 기본적으로 첫째, I의 6/7에 대한 테스트 및 더 AJAX를하지 않는다.

    IE8 및 IE9 위해 당신은 XDomainRequest (XDR)를 사용합니다. 당신은 아래에 보면 당신은 $ 아약스와 유사한 형식의 일종이다 확인할 수 있습니다. 지금까지 내 연구가 저를 가지고 같이 내가 IE6 및 7에서이 도메인 간 작업을 얻을 수 없다 (아직 이것에 대한 주위에 일자리를 찾고). XDR 먼저 IE8 (그것은 또한 IE9에서의)에서 나왔다. 그러니까 기본적으로 첫째, I의 6/7에 대한 테스트 및 더 AJAX를하지 않는다.

    IE10 + 일반적으로 모든 같은 다른 브라우저 크로스 도메인을 할 수있다 (축하 마이크로 소프트 ... 한숨)

    후 다른 그 경우 (분명히 더 나은 브라우저 스니핑 이상) 창에서 'XDomainRequest에 대한 테스트 및 방법, 다른 현명한 ELSE가 $ 아약스 정상적으로를 수행하는 JSON AJAX 요청을 수행합니다.

    도움이 되었기를 바랍니다!! 나를 영원히이 모두 원래 알아 냈 취득에 소요

    XDomainRequest 객체에 대한 정보

    // call with your url (with parameters) 
    // 2nd param is your callback function (which will be passed the json DATA back)
    
    crossDomainAjax('http://www.somecrossdomaincall.com/?blah=123', function (data) {
        // success logic
    });
    
    function crossDomainAjax (url, successCallback) {
    
        // IE8 & 9 only Cross domain JSON GET request
        if ('XDomainRequest' in window && window.XDomainRequest !== null) {
    
            var xdr = new XDomainRequest(); // Use Microsoft XDR
            xdr.open('get', url);
            xdr.onload = function () {
                var dom  = new ActiveXObject('Microsoft.XMLDOM'),
                    JSON = $.parseJSON(xdr.responseText);
    
                dom.async = false;
    
                if (JSON == null || typeof (JSON) == 'undefined') {
                    JSON = $.parseJSON(data.firstChild.textContent);
                }
    
                successCallback(JSON); // internal function
            };
    
            xdr.onerror = function() {
                _result = false;  
            };
    
            xdr.send();
        } 
    
        // IE7 and lower can't do cross domain
        else if (navigator.userAgent.indexOf('MSIE') != -1 &&
                 parseInt(navigator.userAgent.match(/MSIE ([\d.]+)/)[1], 10) < 8) {
           return false;
        }    
    
        // Do normal jQuery AJAX for everything else          
        else {
            $.ajax({
                url: url,
                cache: false,
                dataType: 'json',
                type: 'GET',
                async: false, // must be set to false
                success: function (data, success) {
                    successCallback(data);
                }
            });
        }
    }
    

  3. 3.JQuery와 당신을 위해이 작업을 수행, 유일한 방법은 $ .support.cors를 설정하는 것입니다 = TRUE; 그리고 크로스 도메인 요청 JQuery와 사용자를위한 모든 브라우저에서 잘 작동합니다.

    JQuery와 당신을 위해이 작업을 수행, 유일한 방법은 $ .support.cors를 설정하는 것입니다 = TRUE; 그리고 크로스 도메인 요청 JQuery와 사용자를위한 모든 브라우저에서 잘 작동합니다.


  4. 4.IE8에 대한 jQuery를 도메인 간 AJAX : 간단하게이 jQuery를 플러그인을 설치

    IE8에 대한 jQuery를 도메인 간 AJAX : 간단하게이 jQuery를 플러그인을 설치

    이 1.4kb 플러그인은 인터넷 익스플로러 8, 9에서 바로 작동합니다.

    jQuery를 한 후 플러그인을 포함하고, 정상적으로 귀하의 아약스 요청을 호출합니다. 아무것도 다른 필요하지 않습니다.


  5. 5.IE에 대한 JQuery와 여분의 전송을 추가합니다. (그냥 마지막에 스크립트에이 코드를 추가)

    IE에 대한 JQuery와 여분의 전송을 추가합니다. (그냥 마지막에 스크립트에이 코드를 추가)

    $.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {
    
        if(jQuery.browser.msie && window.XDomainRequest) {
    
            var xdr;
    
            return {
    
                send: function( headers, completeCallback ) {
    
                    // Use Microsoft XDR
                    xdr = new XDomainRequest();
    
                    xdr.open("get", options.url);
    
                    xdr.onload = function() {
    
                        if(this.contentType.match(/\/xml/)){
    
                            var dom = new ActiveXObject("Microsoft.XMLDOM");
                            dom.async = false;
                            dom.loadXML(this.responseText);
                            completeCallback(200, "success", [dom]);
    
                        }else{
    
                            completeCallback(200, "success", [this.responseText]);
    
                        }
    
                    };
    
                    xdr.ontimeout = function(){
                        completeCallback(408, "error", ["The request timed out."]);
                    };
    
                    xdr.onerror = function(){
                        completeCallback(404, "error", ["The requested resource could not be found."]);
                    };
    
                    xdr.send();
              },
              abort: function() {
                  if(xdr)xdr.abort();
              }
            };
          }
        });
    

    이 JQuery와 $ 아약스 실패 도메인 간 AJAX 요청에 대한 내 문제를 해결했다.

    건배.


  6. 6.근처에 오는 사람들은 http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx XDomainRequest의 제한에 대한 어떤 이야기를 읽을 잘 할 수있다

    근처에 오는 사람들은 http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx XDomainRequest의 제한에 대한 어떤 이야기를 읽을 잘 할 수있다


  7. 7.여전히 jQuery를 2.0을 사용하여이 문제를 (나는 내가) 알고있을 누군가를 위해, 제이 데이브 쓴 최고의 jQuery를 해결하지만 난 여전히 즉 자신의 코드에 추가 할 몇 가지 있습니다 :

    여전히 jQuery를 2.0을 사용하여이 문제를 (나는 내가) 알고있을 누군가를 위해, 제이 데이브 쓴 최고의 jQuery를 해결하지만 난 여전히 즉 자신의 코드에 추가 할 몇 가지 있습니다 :

    전체 코드는 다음과 같습니다 :

    // add ajax transport method for cross domain requests when using IE9
    if('XDomainRequest' in window && window.XDomainRequest !== null) {
       $.ajaxTransport("+*", function( options, originalOptions, jqXHR ) {
           // verify if we need to do a cross domain request
           // if not return so we don't break same domain requests
           if (typeof options.crossDomain === 'undefined' || !options.crossDomain) {
               return;
           }
    
            var xdr;
    
            return {
                send: function( headers, completeCallback ) {
                    // Use Microsoft XDR
                    xdr = new XDomainRequest();
                    xdr.open("get", options.url); // NOTE: make sure protocols are the same otherwise this will fail silently
                    xdr.onload = function() {
                        if(this.contentType.match(/\/xml/)){
                            var dom = new ActiveXObject("Microsoft.XMLDOM");
                            dom.async = false;
                            dom.loadXML(this.responseText);
                            completeCallback(200, "success", [dom]);
                        } else {
                            completeCallback(200, "success", [this.responseText]);
                        }
                    };
    
                    xdr.onprogress = function() {};
    
                    xdr.ontimeout = function(){
                        completeCallback(408, "error", ["The request timed out."]);
                    };
    
                    xdr.onerror = function(){
                        completeCallback(404, "error", ["The requested resource could not be found."]);
                    };
    
                    xdr.send();
                },
                abort: function() {
                    if(xdr) xdr.abort();
                }
            };
        });
    }
    

  8. 8.참고 추가

    참고 추가

    $.support.cors = true;
    

    IE8에 대한 작업에 $ 아약스 호출을 강제로 충분했다


  9. 9.간단하게 "? 콜백 =?"추가 (또는 "및 콜백 =?") 당신의 URL에 :

    간단하게 "? 콜백 =?"추가 (또는 "및 콜백 =?") 당신의 URL에 :

    $.getJSON({
        url:myUrl + "?callback=?",
        data: myData,
        success: function(data){
            /*My function stuff*/        
        }
    });
    

    (위와 같이, 크로스 도메인에 대해 제대로 모든 다른 세트) 호출을 수행 할 때이 적절한 JSONP 서식 트리거합니다.

    보다 자세한 설명은 여기에 대한 대답에서 찾을 수 있습니다.


  10. 10.@Furqan 당신은 나를 당신이 HTTP POST 방법으로이 테스트 여부를 알려 주시기 바랍니다 수

    @Furqan 당신은 나를 당신이 HTTP POST 방법으로이 테스트 여부를 알려 주시기 바랍니다 수

    또한 상황의 같은 종류의 작업입니다,하지만 난 다른 도메인에 데이터를 게시 할 수 없습니다입니다 때문에.

    그러나이 글을 읽는 후에는 아주 간단했다 ... 유일한 방법은 당신이 OLD 브라우저 잊어해야합니다. 나는 빠른 참조를 위해 URL 위의 같은에서 POST 방식으로 전송하는 코드를 제공하고있다

    function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
    }
    
    var request = createCORSRequest("POST", "http://www.sanshark.com/");
    var content = "name=sandesh&lastname=daddi";
    if (request){
        request.onload = function(){
        //do something with request.responseText
       alert(request.responseText);
    };
    
     request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                request.setRequestHeader("Content-length", content.length);
                request.send(content);
    }
    

  11. 11.마이크로 소프트는 항상 자멸 (적어도 IE에서) 밭고랑 쟁기 :

    마이크로 소프트는 항상 자멸 (적어도 IE에서) 밭고랑 쟁기 :

    http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/

    CORS는 IE8에 XDomainRequest와 함께 작동합니다. 그러나 IE 8은 파이어 폭스 3.5, 사파리 4+, 그리고 크롬 모든 지원 등의 요청 동안 Preflighted 또는 자격을 요청을 지원하지 않습니다.


  12. 12.나는 대체하여 그것을 해결, IE에서 같은 문제가 있습니다 :

    나는 대체하여 그것을 해결, IE에서 같은 문제가 있습니다 :

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    

    그래서 기본적 JQuery와 버전을 업그레이드합니다.


  13. 13.나는 다른 사람들이없는 동안 일부 CORS 통화가 중단 된 곳 IE9에서 비슷한 문제가 있었다. 나는이 IE9 내 service.get 해결 방법에 연기 추가, 그래서 내가 필요하지 정확히 무엇을했던 XDomainRequest 제안 위 있도록 내 애플도 약속 인터페이스에 따라 달라집니다. 잘하면이 문제에 걸쳐 실행 다른 사람에게 유용 할 수 있습니다. :

    나는 다른 사람들이없는 동안 일부 CORS 통화가 중단 된 곳 IE9에서 비슷한 문제가 있었다. 나는이 IE9 내 service.get 해결 방법에 연기 추가, 그래서 내가 필요하지 정확히 무엇을했던 XDomainRequest 제안 위 있도록 내 애플도 약속 인터페이스에 따라 달라집니다. 잘하면이 문제에 걸쳐 실행 다른 사람에게 유용 할 수 있습니다. :

        get: function (url) {
            if ('XDomainRequest' in window && window.XDomainRequest !== null) {
                var deferred = $.Deferred();
                var xdr      = new XDomainRequest();
    
                xdr.open("get", url);
    
                xdr.onload = function() {
                  json = xdr.responseText;
                  parsed_json = $.parseJSON(json);
                  deferred.resolve(parsed_json);
                }
    
                xdr.send();
                return deferred;
            } else {
                return $.ajax({
                    url: url,
                    type: 'GET',
                    dataType: 'json',
                    crossDomain: true
                });
            }
        }
    

  14. 14.이 때문에 문제의 포맷의 부족으로 말하기 어렵다,하지만 난 아약스 호출 두 가지 문제를 볼 생각합니다.

    이 때문에 문제의 포맷의 부족으로 말하기 어렵다,하지만 난 아약스 호출 두 가지 문제를 볼 생각합니다.

    1) 프로그램 따옴표 / ContentType을 위해 x-www-form-urlencoded를되어야

    2)의 contentType 및 비동기 매개 변수를 구분하는 쉼표가 있어야합니다.

  15. from https://stackoverflow.com/questions/3362474/jquery-ajax-fails-in-ie-on-cross-domain-calls by cc-by-sa and MIT license