2014-01-29 36 views
3

我試圖使跨域跨瀏覽器.js請求(沒有任何庫)。Mozilla和Chrome中的XMLHttpRequest狀態0錯誤

var isIE8 = window.XDomainRequest ? true : false; 
var invocation = createCrossDomainRequest(); 
var url = 'http://someserver.com/cgi-bin/targets.cgi?sid='; 

function createCrossDomainRequest(url, handler) 
{ 
    var request; 
    if (isIE8) 
    { 
     request = new window.XDomainRequest(); 
    } 
    else 
    { 
     request = new XMLHttpRequest(); 
    } 
    return request; 
} 

function sendTarget(sid,target) 
{ 
    if (invocation) 
    {    
     var phone_id = getCookie('phone_cookie'); 
     url = url + sid +'&target='+target+'&phone_id='+phone_id+'&url='+encodeURIComponent(document.URL); 
     if(isIE8) 
     { 
      invocation.onload = outputResult; 
      invocation.open("GET", url, true); 
      invocation.send(); 
     } 
     else 
     { 
      invocation.open('GET', url, true); 
      invocation.onreadystatechange = handler; 
      invocation.send(); 
     } 
    } 
    else 
    { 
     var text = "No Invocation TookPlace At All"; 
    } 
} 

function handler(evtXHR) 
{ 
    if (invocation.readyState == 4) 
    { 
     if (invocation.status == 200) 
     { 
      outputResult(); 
     } 
     else 
     { 
      var text = "Invocation Errors Occured"; 
     } 
    } 
} 

function outputResult() 
{ 
    var response = invocation.responseText; 
} 

它適用於IE,但不適用於Mozilla和Chrome。這些瀏覽器收到錯誤「發生調用錯誤」。 invocation.status爲零。 Access-Control-Allow-Origin設置爲*。

我需要做些什麼來解決這個問題?

我不能使用任何庫,只是乾淨的JS(技術問題)。沒有JQuery!此代碼需要在許多客戶網站上(而不是一個或兩個)。我不需要得到迴應,只需要發送請求即可。而且我沒有在XMLHttpRequest上循環 - 任何想法?

回答

2

我已經採取了上面提供的代碼,並略微修改它,使其更通用一些。但是,您應該能夠將其更改爲適合。下面的代碼在Chrome和Firefox:

var isIE8 = window.XDomainRequest ? true : false; 
var url = 'http://www.phobos7.co.uk/research/xss/simple.php'; 
var resultText = ''; 
var invocation = createCrossDomainRequest(); 
makeRequest(); 

function createCrossDomainRequest(url, handler) { 
    var request; 
    if (isIE8) { 
     request = new window.XDomainRequest(); 
    } else { 
     request = new XMLHttpRequest(); 
    } 
    return request; 
} 

function makeRequest() { 
    if (invocation) { 
     if (isIE8) { 
      invocation.onload = requestSucceeded; 
      invocation.open("GET", url, true); 
      invocation.send(); 
     } else { 
      invocation.open('GET', url, true); 
      invocation.onreadystatechange = handler; 
      invocation.send(); 
     } 
    } else { 
     resultText = "No Invocation TookPlace At All"; 
    } 
} 

function handler(evtXHR) { 
    if (invocation.readyState == 4) { 
     if (invocation.status == 200) { 
      requestSucceeded(); 
     } else { 
      resultText = "Invocation Errors Occured"; 
     } 
    } 
} 

function requestSucceeded() { 
    resultText = invocation.responseText; 
    outputResult(); 
} 

function outputResult() { 
    document.getElementById('output').innerHTML = resultText; 
} 

你可以在這裏測試:從本網站http://jsfiddle.net/leggetter/3QfQe/

的響應報頭 - 允許CORS - 是:

Access-Control-Allow-Origin:* 
Connection:Keep-Alive 
Content-Type:text/html 
Date:Wed, 12 Feb 2014 22:48:37 GMT 
Keep-Alive:timeout=5, max=100 
Server:Apache 
Transfer-Encoding:chunked 
X-Powered-By:PHP/5.3.24 

只有Access-Control-Allow-Origin:*是必需的。

如果您使用上面的JavaScript並確保Access-Control-Allow-Origin:*標頭已設置,您將能夠通過JavaScript發出跨域請求。

+0

代碼正在處理您設置的網址。當我在應用程序中嘗試任何其他跨域網址時,它又將狀態設置爲0.請建議。 –

+0

「代碼正在工作」 - 你的意思是說它「不工作」?我已經測試過,它仍然適用於我。如果您發現問題,請提供更多信息。 – leggetter

+0

它正在處理您的網址。當我用我的URL替換它時,它再次在chrome和firefox中將狀態設置爲0。 –

相關問題