6

これは重複しているように見えますが、似たような質問にはっきりと答えられません。XMLのXDomainRequest(CORS)がIE8/IE9で「アクセスが拒否されました」というエラーが発生しました

一部のXMLに対してCORSリクエストを実行しようとすると、IE8から「アクセスが拒否されました」というJSエラーが発生します。

私のコードは、この例から構成されている:http://www.html5rocks.com/en/tutorials/cors/

から

// Create the XHR object. 
function createCORSRequest(method, url) { 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr) { 
    // XHR for Chrome/Firefox/Opera/Safari. 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined") { 
    // XDomainRequest for IE. 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    // CORS not supported. 
    xhr = null; 
    } 
    return xhr; 
} 

// Helper method to parse the title tag from the response. 
function getTitle(text) { 
    return text.match('<title>(.*)?</title>')[1]; 
} 

// Make the actual CORS request. 
function makeCorsRequest() { 
    // All HTML5 Rocks properties support CORS. 
    var url = 'http://updates.html5rocks.com'; 

    var xhr = createCORSRequest('GET', url); 
    if (!xhr) { 
    alert('CORS not supported'); 
    return; 
    } 

    // Response handlers. 
    xhr.onload = function() { 
    var text = xhr.responseText; 
    var title = getTitle(text); 
    alert('Response from CORS request to ' + url + ': ' + title); 
    }; 

    xhr.onerror = function() { 
    alert('Woops, there was an error making the request.'); 
    }; 

    xhr.send(); 
} 

このべき XDomainRequestを使用してIE8での仕事、と私は例のページをロードし、上の「サンプルの実行」をクリックしてくださいhtml5rocksページ、IE8で動作します。しかし、自分のページにコードをコピーして実行するとすぐに、XDomainRequestのxhr.open()行に「アクセスが拒否されました」というエラーが表示されます。

これは私には本当にうんざりしています。サーバーは正しく設定されているので、フロントエンドとは何か関係があります。助けることができる誰にも事前に感謝します!

+0

あなたはHTTPSでいますか? – epascarello

+0

@epascarelloいいえ、使用されているURLはhttpsを超えていません... – tripRev

+0

どのURLにアクセスしていますか? – SilverlightFox

答えて

8

OK、問題はこの記事からいくつかの提案で解決されたIE8 & 9にweirdnessesにダウンしていた:http://cypressnorth.com/programming/internet-explorer-aborting-ajax-requests-fixed/(主にいくつかの空白のハンドラ関数を設定し、0のタイムアウトで.send()をラップします)。

ここではIE8/9/10月11日& FF/Chromeで動作します私の最終的なコードです:

function doRequest(url) { 

    // Create the XHR object. 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr) { 
     // XHR for Chrome/Firefox/Opera/Safari. 
     xhr.open('get', url, true); 
    }else if(typeof XDomainRequest != "undefined") { 
     // XDomainRequest for IE. 
     xhr = new XDomainRequest(); 
     xhr.open('get', url); 
    }else{ 
     // CORS not supported. 
     xhr = null; 
    }; 

    if (!xhr) { 
     return; 
    }; 

    // Response handlers. 
    xhr.onload = function() { 
     //do what you want with the response. Remember to use xhr.responseText for ie8 compatibility, because it doesn't have .responseXML 
     if(xhr.responseXML) { 
      xml = this.responseXML; 
     }else if(xhr.responseText){ 
      xml = new ActiveXObject('Microsoft.XMLDOM'); 
      xml.loadXML(xhr.responseText); 
     }; 
    }; 

    xhr.onerror = function() { 
     //do what you want on error 
    }; 

    //these blank handlers need to be set to fix ie9 http://cypressnorth.com/programming/internet-explorer-aborting-ajax-requests-fixed/ 
    xhr.onprogress = function() { }; 
    xhr.ontimeout = function() { }; 

    //do it, wrapped in timeout to fix ie9 
    setTimeout(function() { 
       xhr.send(); 
      }, 0); 

}; 
+0

このメソッドにどのようにコールバックを渡しますか?または、それ以上の場合に使用する変数に応答をバインドする方法はありますか?ありがとうございました! – Notflip

+1

@Notflip doRequest funcがコールバックパラメータを受け入れ、xhr.onloadの中でコールバックを呼び出し、応答値となる 'xml'を渡すことができます。 – tripRev