CORS请求触发而不在IE9中的window.onbeforeunload事件上发送表单数据

时间:2014-07-30 18:30:31

标签: javascript ajax internet-explorer cors

我有一个非常简单的功能,旨在获取表单数据并通过CORS请求发送它。基本上它看起来像这样......

window.onbeforeunload = function() {
    formData = getFormData();   
    logAbandonment(formData);
    // return formData;
    // alert(formData);
}

function logAbandonment(formData)
{
    if(!cors_request) {
        cors_request = true;
    } else {
        return;
    }

    var url = 'http://mydomain.lan/sub/index.php';
    var xhr = createCORSRequest('POST', url);
    if (!xhr) {
        console.log('Error:  CORS not supported.');
    }

    xhr.send(formData);
}

function createCORSRequest(method, url) 
{
    var xhr = new XMLHttpRequest();

    if ("withCredentials" in xhr) {

        // Check if the XMLHttpRequest object has a "withCredentials" property.
        // "withCredentials" only exists on XMLHTTPRequest2 objects.
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined") {

        // Otherwise, check if XDomainRequest.
        // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
        xhr = new XDomainRequest();
        xhr.open(method, url);
        xhr.onprogress = function () { };
        xhr.ontimeout = function () { };
        xhr.onerror = function () { };
        xhr.onload = function() { };
    } else {

        // Otherwise, CORS is not supported by the browser.
        xhr = null;

    }

    return xhr;
}

function getFormData()
{
    if(typeof FormData == 'undefined') {
        return serialize(document.getElementById('AppForm'));
    } else {
        return new FormData(document.getElementById('AppForm'));
    }
}

因为这是我正在使用的IE9,我正在使用XDomainRequest javascript对象。

它成功触发了ajax请求,但这里是我遇到问题的地方。它会在不发送formData的情况下触发它,除非我取消注释返回或警报行,在这种情况下它完美地工作。当我这样做时,我可以在警报中看到它应该说的正确数据。

我注意到的另一件事是,只有当我关闭浏览器或关闭标签时才会发生这种情况。如果我刷新页面,它的工作方式就像我想要的那样。

我想也许IE9在请求完成之前有一些奇怪的方法来破坏dom,但不幸的是,我无法想办法在XDomainRequest上将其设置为async false。

我也试过设置超时,但这似乎完全打破了它。

1 个答案:

答案 0 :(得分:0)

这不是一个解决方法,但我发现在调用xdr的open方法时将查询字符串附加到url的末尾时,这非常有效。