javascript - Mozilla 和 Chrome 中的 XMLHttpRequest 状态 0 错误

标签 javascript xmlhttprequest cross-domain

我正在尝试进行跨域跨浏览器 .js 请求(没有任何库)。

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 上循环 - 有什么想法吗?

最佳答案

我采用了您在上面提供的代码并对其进行了稍微修改,使其更加通用。但是,您应该能够将其改回适合的状态。以下代码适用于 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/

来自此站点的响应 header - 允许 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:* header ,您将能够从 JavaScript 发出跨域请求。

关于javascript - Mozilla 和 Chrome 中的 XMLHttpRequest 状态 0 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21419576/

相关文章:

javascript - 将详细信息/子行添加到数据表中的某些条目

javascript - 你如何将数据从 JS 发布到 Flask,操作数据然后将它发送回 JS?

javascript - setRequestHeader 不起作用,我想设置 header ,然后在 Amazon EC2 中以 ajax 发出 GET 请求

actionscript-3 - 安全沙箱违规,无法通过 Socket 连接到服务器

javascript - 类型不是 "text/javascript"的脚本标记中的 Intellij idea javascript 识别

javascript - jQuery slider 在 Chrome 中表现得很奇怪(+其他问题)

javascript - 如何跨域请求二进制数据?

google-chrome - XMLHttpRequest CORS 到 Google Cloud Storage 仅适用于预检请求

java - jetty 跨源过滤器

iphone - iframe Safari 中的跨域 cookie